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:41:39 +0000 (14:41 -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 c60f7e4c9c4db0f3d00dff773b2c537b0cc4bd43..b0d53dfc8548d76c05f0c4df7588ca3992fb6dae 100644 (file)
@@ -1205,6 +1205,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 aeb061330dbc83d911df33fd1e428fb75c22c165..51f97fbd1e7ea5fd288b4c43158bd3266569783a 100644 (file)
@@ -1065,6 +1065,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);
 
@@ -1823,6 +1824,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 dc6f2f7fc42833e551973191e4a21e8eed2ae2b9..c1a7fec251e78d2134255f853ea379bcd1a9087c 100644 (file)
@@ -26,6 +26,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"
@@ -113,12 +114,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) {
@@ -131,7 +134,7 @@ error:
 
 static int check_kernel_stream(struct lttng_consumer_stream *stream)
 {
-       uint64_t ts;
+       uint64_t ts, stream_id;
        int ret;
 
        /*
@@ -159,8 +162,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;
                }
@@ -174,7 +182,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);
@@ -205,8 +213,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.03037 seconds and 4 git commands to generate.