X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fviewer-stream.c;h=9d852b661ab420332308fb5d16a75fe093326dd0;hp=70654c79710c19a17f9e3a30d3795156fbfed1f9;hb=8bb66c3cd60938352927ee865759433387324250;hpb=3ff5c5db220d92baf64280ba54713fcafe76142e diff --git a/src/bin/lttng-relayd/viewer-stream.c b/src/bin/lttng-relayd/viewer-stream.c index 70654c797..9d852b661 100644 --- a/src/bin/lttng-relayd/viewer-stream.c +++ b/src/bin/lttng-relayd/viewer-stream.c @@ -21,6 +21,10 @@ #include #include #include +#include +#include +#include +#include #include "lttng-relayd.h" #include "viewer-stream.h" @@ -124,7 +128,7 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream, * If we never received an index for the current stream, delay * the opening of the index, otherwise open it right now. */ - if (stream->index_received_seqcount == 0) { + if (stream->index_file == NULL) { vstream->index_file = NULL; } else { const uint32_t connection_major = stream->trace->session->major; @@ -150,10 +154,37 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream, } } + /* + * If we never received a data file for the current stream, delay the + * opening, otherwise open it right now. + */ + if (stream->file) { + int ret; + char file_path[LTTNG_PATH_MAX]; + enum lttng_trace_chunk_status status; + + ret = utils_stream_file_path(stream->path_name, + stream->channel_name, stream->tracefile_size, + vstream->current_tracefile_id, NULL, file_path, + sizeof(file_path)); + if (ret < 0) { + goto error_unlock; + } + + status = lttng_trace_chunk_open_fs_handle( + vstream->stream_file.trace_chunk, file_path, + O_RDONLY, 0, &vstream->stream_file.handle, + true); + if (status != LTTNG_TRACE_CHUNK_STATUS_OK) { + goto error_unlock; + } + } + if (seek_t == LTTNG_VIEWER_SEEK_LAST && vstream->index_file) { off_t lseek_ret; - lseek_ret = lseek(vstream->index_file->fd, 0, SEEK_END); + lseek_ret = fs_handle_seek( + vstream->index_file->file, 0, SEEK_END); if (lseek_ret < 0) { goto error_unlock; } @@ -204,9 +235,9 @@ static void viewer_stream_release(struct urcu_ref *ref) viewer_stream_unpublish(vstream); - if (vstream->stream_file.fd) { - stream_fd_put(vstream->stream_file.fd); - vstream->stream_file.fd = NULL; + if (vstream->stream_file.handle) { + fs_handle_close(vstream->stream_file.handle); + vstream->stream_file.handle = NULL; } if (vstream->index_file) { lttng_index_file_put(vstream->index_file); @@ -261,20 +292,42 @@ void viewer_stream_put(struct relay_viewer_stream *vstream) rcu_read_unlock(); } +void viewer_stream_close_files(struct relay_viewer_stream *vstream) +{ + if (vstream->index_file) { + lttng_index_file_put(vstream->index_file); + vstream->index_file = NULL; + } + if (vstream->stream_file.handle) { + fs_handle_close(vstream->stream_file.handle); + vstream->stream_file.handle = NULL; + } +} + +void viewer_stream_sync_tracefile_array_tail(struct relay_viewer_stream *vstream) +{ + const struct relay_stream *stream = vstream->stream; + uint64_t seq_tail; + + vstream->current_tracefile_id = tracefile_array_get_file_index_tail(stream->tfa); + seq_tail = tracefile_array_get_seq_tail(stream->tfa); + if (seq_tail == -1ULL) { + seq_tail = 0; + } + vstream->index_sent_seqcount = seq_tail; +} + /* * Rotate a stream to the next tracefile. * * Must be called with the rstream lock held. - * Returns 0 on success, 1 on EOF, a negative value on error. + * Returns 0 on success, 1 on EOF. */ int viewer_stream_rotate(struct relay_viewer_stream *vstream) { int ret; uint64_t new_id; const struct relay_stream *stream = vstream->stream; - const uint32_t connection_major = stream->trace->session->major; - const uint32_t connection_minor = stream->trace->session->minor; - enum lttng_trace_chunk_status chunk_status; /* Detect the last tracefile to open. */ if (stream->index_received_seqcount @@ -314,32 +367,8 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream) tracefile_array_get_file_index_tail(stream->tfa); vstream->index_sent_seqcount = seq_tail; } - - if (vstream->index_file) { - lttng_index_file_put(vstream->index_file); - vstream->index_file = NULL; - } - if (vstream->stream_file.fd) { - stream_fd_put(vstream->stream_file.fd); - vstream->stream_file.fd = NULL; - } - chunk_status = lttng_index_file_create_from_trace_chunk_read_only( - vstream->stream_file.trace_chunk, - stream->path_name, - stream->channel_name, - stream->tracefile_size, - vstream->current_tracefile_id, - lttng_to_index_major(connection_major, - connection_minor), - lttng_to_index_minor(connection_major, - connection_minor), - true, &vstream->index_file); - if (chunk_status != LTTNG_TRACE_CHUNK_STATUS_OK) { - ret = -1; - goto end; - } else { - ret = 0; - } + viewer_stream_close_files(vstream); + ret = 0; end: return ret; }