Fix: get the stream_id when generating live beacons
authorJulien Desfossez <jdesfossez@efficios.com>
Mon, 14 Jul 2014 18:05:48 +0000 (14:05 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 14 Jul 2014 18:23:45 +0000 (14:23 -0400)
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 <jdesfossez@efficios.com>
src/bin/lttng-relayd/live.c
src/bin/lttng-relayd/main.c
src/bin/lttng-relayd/stream.h
src/common/consumer-timer.c

index d8517d2f6b14ed8a8e58668a90d282020fbff19c..8c716dbde9852e1de1b9a04261fb59c22035e767 100644 (file)
@@ -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) {
index ac03cf846a7ec7992d7c21f9423d0af6813f22db..3a6bebaf7d6d3dc1ab5f7cf4fe76522d6f5c56fd 100644 (file)
@@ -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) {
                /*
index c6bdb307ebb39682c4a705cf71c3612d7a2b7ae3..5aca693cce4a5ea131ac383909da542ecb309576 100644 (file)
@@ -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.
index c659bf63333a0de56fc568f99c167fb55e12e24c..d36e2bccfdd08cb304d2d362403325db85c4c3af 100644 (file)
@@ -27,6 +27,7 @@
 #include <common/kernel-ctl/kernel-ctl.h>
 #include <common/kernel-consumer/kernel-consumer.h>
 #include <common/consumer-stream.h>
+#include <lttng/ust-ctl.h>
 
 #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;
                }
This page took 0.030318 seconds and 4 git commands to generate.