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=f3baf105bb466dd36f2edd23f69a3a535f21f556;hb=8bb66c3cd60938352927ee865759433387324250;hpb=78118e3bdace1208479db18df6553ab9c4400426 diff --git a/src/bin/lttng-relayd/viewer-stream.c b/src/bin/lttng-relayd/viewer-stream.c index f3baf105b..9d852b661 100644 --- a/src/bin/lttng-relayd/viewer-stream.c +++ b/src/bin/lttng-relayd/viewer-stream.c @@ -21,13 +21,16 @@ #include #include #include +#include +#include +#include +#include #include "lttng-relayd.h" #include "viewer-stream.h" static void viewer_stream_destroy(struct relay_viewer_stream *vstream) { - lttng_trace_chunk_put(vstream->stream_file.trace_chunk); free(vstream->path_name); free(vstream->channel_name); free(vstream); @@ -125,13 +128,14 @@ 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; const uint32_t connection_minor = stream->trace->session->minor; + enum lttng_trace_chunk_status chunk_status; - vstream->index_file = lttng_index_file_create_from_trace_chunk_read_only( + 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, @@ -139,8 +143,39 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream, lttng_to_index_major(connection_major, connection_minor), lttng_to_index_minor(connection_major, - connection_minor)); - if (!vstream->index_file) { + connection_minor), + true, &vstream->index_file); + if (chunk_status != LTTNG_TRACE_CHUNK_STATUS_OK) { + if (chunk_status == LTTNG_TRACE_CHUNK_STATUS_NO_FILE) { + vstream->index_file = NULL; + } else { + goto error_unlock; + } + } + } + + /* + * 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; } } @@ -148,7 +183,8 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream, 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; } @@ -161,9 +197,8 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream, /* Globally visible after the add unique. */ lttng_ht_node_init_u64(&vstream->stream_n, stream->stream_handle); - lttng_ht_add_unique_u64(viewer_streams_ht, &vstream->stream_n); - urcu_ref_init(&vstream->ref); + lttng_ht_add_unique_u64(viewer_streams_ht, &vstream->stream_n); return vstream; @@ -200,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); @@ -212,7 +247,8 @@ static void viewer_stream_release(struct urcu_ref *ref) stream_put(vstream->stream); vstream->stream = NULL; } - + lttng_trace_chunk_put(vstream->stream_file.trace_chunk); + vstream->stream_file.trace_chunk = NULL; call_rcu(&vstream->rcu_node, viewer_stream_destroy_rcu); } @@ -256,19 +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; /* Detect the last tracefile to open. */ if (stream->index_received_seqcount @@ -308,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; - } - vstream->index_file = - 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)); - if (!vstream->index_file) { - ret = -1; - goto end; - } else { - ret = 0; - } + viewer_stream_close_files(vstream); + ret = 0; end: return ret; }