From 3e778ab02ef13b55c0be8f752e126eee55e0956b Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Wed, 20 May 2020 20:53:45 -0400 Subject: [PATCH] Fix: common: fs_handle_seek returns negative value on success MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Observed issue ============== Babeltrace 1/2 fails to fetch data from a live session. Error: PLUGIN/SRC.CTF.LTTNG-LIVE/VIEWER lttng_live_get_stream_bytes@viewer-connection.c:1593 [lttng-live] Received get_data_packet response: error PLUGIN/CTF/MSG-ITER request_medium_bytes@msg-iter.c:546 [lttng-live] User function failed: status=ERROR PLUGIN/CTF/MSG-ITER ctf_msg_iter_get_next_message@msg-iter.c:2881 [lttng-live] Cannot handle state: msg-it-addr=0x562d87521a40, state=DSCOPE_TRACE_PACKET_HEADER_BEGIN PLUGIN/SRC.CTF.LTTNG-LIVE lttng_live_iterator_next_handle_one_active_data_stream@lttng-live.c:821 [lttng-live] CTF message iterator failed to get next message: msg-iter=0x562d87521a40, msg-iter-status=ERROR PLUGIN/SRC.CTF.LTTNG-LIVE lttng_live_msg_iter_next@lttng-live.c:1499 [lttng-live] Error preparing the next batch of messages: live-iter-status=LTTNG_LIVE_ITERATOR_STATUS_ERROR LIB/MSG-ITER bt_message_iterator_next@iterator.c:865 Component input port message iterator's "next" method failed: iter-addr=0x562d8751ab70, iter-upstream-comp-name="lttng-live", iter-upstream-comp-log-level=WARNING, iter-upstream-comp-class-type=SOURCE, iter-upstream-comp-class-name="lttng-live", iter-upstream-comp-class-partial-descr="Connect to an LTTng relay daemon", iter-upstream-port-type=OUTPUT, iter-upstream-port-name="out", status=ERROR PLUGIN/FLT.UTILS.MUXER muxer_upstream_msg_iter_next@muxer.c:446 [muxer] Upstream iterator's next method returned an error: status=ERROR PLUGIN/FLT.UTILS.MUXER validate_muxer_upstream_msg_iters@muxer.c:989 [muxer] Cannot validate muxer's upstream message iterator wrapper: muxer-msg-iter-addr=0x562d87515280, muxer-upstream-msg-iter-wrap-addr=0x562d8751ca90 PLUGIN/FLT.UTILS.MUXER muxer_msg_iter_next@muxer.c:1417 [muxer] Cannot get next message: comp-addr=0x562d8751a260, muxer-comp-addr=0x562d8751a2e0, muxer-msg-iter-addr=0x562d87515280, msg-iter-addr=0x562d8751aa90, status=ERROR LIB/MSG-ITER bt_message_iterator_next@iterator.c:865 Component input port message iterator's "next" method failed: iter-addr=0x562d8751aa90, iter-upstream-comp-name="muxer", iter-upstream-comp-log-level=WARNING, iter-upstream-comp-class-type=FILTER, iter-upstream-comp-class-name="muxer", iter-upstream-comp-class-partial-descr="Sort messages from multiple inpu", iter-upstream-port-type=OUTPUT, iter-upstream-port-name="out", status=ERROR LIB/GRAPH consume_graph_sink@graph.c:462 Component's "consume" method failed: status=ERROR, comp-addr=0x562d8751a3d0, comp-name="pretty", comp-log-level=WARNING, comp-class-type=SINK, comp-class-name="pretty", comp-class-partial-descr="Pretty-print messages (`text` fo", comp-class-is-frozen=0, comp-class-so-handle-addr=0x562d8751a110, comp-class-so-handle-path="/usr/local/lib/babeltrace2/plugins/babeltrace-plugin-text.so", comp-input-port-count=1, comp-output-port-count=0 CLI cmd_run@babeltrace2.c:2529 Graph failed to complete successfully PLUGIN/SRC.CTF.LTTNG-LIVE/VIEWER lttng_live_session_detach@viewer-connection.c:1211 [lttng-live] Unknown detach return code 0 The relevant relayd log: DEBUG2 - Relay get data packet (in viewer_get_packet() at live.c:1770) PERROR - Failed to seek file system handle of viewer stream 4 to offset 2244861952: Success (in viewer_get_packet() at live.c:1810) DEBUG1 - Sent 262156 bytes for stream 4 (in viewer_get_packet() at live.c:1852) Cause ===== The fs_handle_seek function calls lseek on a stream file of ~2.5GB. The return value of the lseek call is downcasted from off_t (signed 64 bit on my system) to int. The resulting value is negative and force an error at the call sites. Solution ======== Use off_t as the return type. Note that current call sites of fs_handle_seek already expect an off_t return value. ag fs_handle_seek: src/bin/lttng-relayd/stream.c 249: lseek_ret = fs_handle_seek(previous_stream_file, previous_stream_copy_origin, SEEK_SET); src/bin/lttng-relayd/live.c 1804: lseek_ret = fs_handle_seek(vstream->stream_file.handle, src/bin/lttng-relayd/viewer-stream.c 176: lseek_ret = fs_handle_seek( ag lseek_ret: src/bin/lttng-relayd/stream.c 193: off_t lseek_ret, previous_stream_copy_origin; src/bin/lttng-relayd/live.c 1760: off_t lseek_ret; src/bin/lttng-relayd/viewer-stream.c 174: off_t lseek_ret; Known drawbacks ========= This limitation existed before this patch. On 32bit system without _FILE_OFFSET_BITS=64 defined at compile time (-D_FILE_OFFSET_BITS=64) the lseek operation could return EOVERFLOW for stream file bigger then 2,147,483,647 bytes. Anybody working on a 32bit system should be aware of the limitation of working in 32bit. Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau Change-Id: Ib6c7bb3c9c402bdfbe9b447b1f8f298de6058caa --- src/common/fs-handle.c | 6 +++--- src/common/fs-handle.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/fs-handle.c b/src/common/fs-handle.c index ff081235c..46d9d7de5 100644 --- a/src/common/fs-handle.c +++ b/src/common/fs-handle.c @@ -70,7 +70,7 @@ end: LTTNG_HIDDEN int fs_handle_truncate(struct fs_handle *handle, off_t offset) { - int ret; + int ret; const int fd = fs_handle_get_fd(handle); if (fd < 0) { @@ -85,9 +85,9 @@ end: } LTTNG_HIDDEN -int fs_handle_seek(struct fs_handle *handle, off_t offset, int whence) +off_t fs_handle_seek(struct fs_handle *handle, off_t offset, int whence) { - int ret; + off_t ret; const int fd = fs_handle_get_fd(handle); if (fd < 0) { diff --git a/src/common/fs-handle.h b/src/common/fs-handle.h index e36f7a4de..1627f7cfe 100644 --- a/src/common/fs-handle.h +++ b/src/common/fs-handle.h @@ -69,6 +69,6 @@ LTTNG_HIDDEN int fs_handle_truncate(struct fs_handle *handle, off_t offset); LTTNG_HIDDEN -int fs_handle_seek(struct fs_handle *handle, off_t offset, int whence); +off_t fs_handle_seek(struct fs_handle *handle, off_t offset, int whence); #endif /* FS_HANDLE_H */ -- 2.34.1