From 528f2ffaebbc88b3fd541fa404b567b878aa5255 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Mon, 14 Jul 2014 14:05:48 -0400 Subject: [PATCH] Fix: get the stream_id when generating live beacons When we send an empty index (beacon), we need to extract the stream_id to avoid stalling the client on inactive streams on startup. Since the live clients need to know this feature is implemented, we had to bump the lttng-live protocol version. This fix should be backported to stable-2.4 as well. Refs: #811 Signed-off-by: Julien Desfossez --- src/bin/lttng-relayd/live.c | 1 + src/bin/lttng-relayd/main.c | 4 ++++ src/bin/lttng-relayd/stream.h | 4 ++++ src/common/consumer-timer.c | 23 ++++++++++++++++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c index d8517d2f6..8c716dbde 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -1206,6 +1206,7 @@ static int check_index_status(struct relay_viewer_stream *vstream, */ index->status = htobe32(LTTNG_VIEWER_INDEX_INACTIVE); index->timestamp_end = htobe64(rstream->beacon_ts_end); + index->stream_id = htobe64(rstream->ctf_stream_id); goto index_ready; } else if (rstream->total_index_received <= vstream->last_sent_index && !vstream->close_write_flag) { diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index ac03cf846..3a6bebaf7 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -1205,6 +1205,7 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, stream->session_id = session->id; stream->index_fd = -1; stream->read_index_fd = -1; + stream->ctf_stream_id = -1ULL; lttng_ht_node_init_u64(&stream->node, stream->stream_handle); pthread_mutex_init(&stream->lock, NULL); @@ -1963,6 +1964,9 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, } copy_index_control_data(index, &index_info); + if (stream->ctf_stream_id == -1ULL) { + stream->ctf_stream_id = be64toh(index_info.stream_id); + } if (index_created) { /* diff --git a/src/bin/lttng-relayd/stream.h b/src/bin/lttng-relayd/stream.h index c6bdb307e..5aca693cc 100644 --- a/src/bin/lttng-relayd/stream.h +++ b/src/bin/lttng-relayd/stream.h @@ -76,6 +76,10 @@ struct relay_stream { * timestamp end, when it is active, this field == -1ULL. */ uint64_t beacon_ts_end; + /* + * CTF stream ID, -1ULL when unset. + */ + uint64_t ctf_stream_id; /* * To protect the update of the close_write_flag and the checks of * the tracefile_count_current. diff --git a/src/common/consumer-timer.c b/src/common/consumer-timer.c index c659bf633..d36e2bccf 100644 --- a/src/common/consumer-timer.c +++ b/src/common/consumer-timer.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "consumer-timer.h" #include "consumer-testpoint.h" @@ -114,12 +115,14 @@ static void metadata_switch_timer(struct lttng_consumer_local_data *ctx, } } -static int send_empty_index(struct lttng_consumer_stream *stream, uint64_t ts) +static int send_empty_index(struct lttng_consumer_stream *stream, uint64_t ts, + uint64_t stream_id) { int ret; struct ctf_packet_index index; memset(&index, 0, sizeof(index)); + index.stream_id = htobe64(stream_id); index.timestamp_end = htobe64(ts); ret = consumer_stream_write_index(stream, &index); if (ret < 0) { @@ -132,7 +135,7 @@ error: static int check_kernel_stream(struct lttng_consumer_stream *stream) { - uint64_t ts; + uint64_t ts, stream_id; int ret; /* @@ -160,8 +163,13 @@ static int check_kernel_stream(struct lttng_consumer_stream *stream) ret = -1; goto error_unlock; } + ret = kernctl_get_stream_id(stream->wait_fd, &stream_id); + if (ret < 0) { + PERROR("kernctl_get_stream_id"); + goto error_unlock; + } DBG("Stream %" PRIu64 " empty, sending beacon", stream->key); - ret = send_empty_index(stream, ts); + ret = send_empty_index(stream, ts, stream_id); if (ret < 0) { goto error_unlock; } @@ -175,7 +183,7 @@ error_unlock: static int check_ust_stream(struct lttng_consumer_stream *stream) { - uint64_t ts; + uint64_t ts, stream_id; int ret; assert(stream); @@ -206,8 +214,13 @@ static int check_ust_stream(struct lttng_consumer_stream *stream) ret = -1; goto error_unlock; } + ret = ustctl_get_stream_id(stream->ustream, &stream_id); + if (ret < 0) { + PERROR("ustctl_get_stream_id"); + goto error_unlock; + } DBG("Stream %" PRIu64 " empty, sending beacon", stream->key); - ret = send_empty_index(stream, ts); + ret = send_empty_index(stream, ts, stream_id); if (ret < 0) { goto error_unlock; } -- 2.34.1