Fix: make sure no index is in flight before using inactivity beacons
authorJulien Desfossez <jdesfossez@efficios.com>
Wed, 27 Aug 2014 17:59:21 +0000 (13:59 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Wed, 3 Sep 2014 19:15:14 +0000 (15:15 -0400)
Since the index is sent in two parts on two separate connections from
the consumer, there can be cases where we receive an inactivity beacon
between the index creation and the data reception.

This fix prevents from using the inactivity beacon if we know a data
index is coming.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-relayd/main.c
src/bin/lttng-relayd/stream.h

index a3b8016db46d157dc44f478553011f489b60c591..fa5a7db86c393640c15fe9e8b3bf5f652da98111 100644 (file)
@@ -1944,9 +1944,10 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr,
                DBG("Received live beacon for stream %" PRIu64, stream->stream_handle);
 
                /*
-                * Only flag a stream inactive when it has already received data.
+                * Only flag a stream inactive when it has already received data
+                * and no indexes are in flight.
                 */
-               if (stream->total_index_received > 0) {
+               if (stream->total_index_received > 0 && stream->indexes_in_flight == 0) {
                        stream->beacon_ts_end = be64toh(index_info.timestamp_end);
                }
                ret = 0;
@@ -1963,6 +1964,7 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr,
                        goto end_rcu_unlock;
                }
                index_created = 1;
+               stream->indexes_in_flight++;
        }
 
        copy_index_control_data(index, &index_info);
@@ -1993,6 +1995,8 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr,
                        goto end_rcu_unlock;
                }
                stream->total_index_received++;
+               stream->indexes_in_flight--;
+               assert(stream->indexes_in_flight >= 0);
        }
 
 end_rcu_unlock:
@@ -2156,6 +2160,7 @@ static int handle_index_data(struct relay_stream *stream, uint64_t net_seq_num,
                        goto error;
                }
                index_created = 1;
+               stream->indexes_in_flight++;
        }
 
        if (rotate_index || stream->index_fd < 0) {
@@ -2198,6 +2203,8 @@ static int handle_index_data(struct relay_stream *stream, uint64_t net_seq_num,
                        goto error;
                }
                stream->total_index_received++;
+               stream->indexes_in_flight--;
+               assert(stream->indexes_in_flight >= 0);
        }
 
 error:
index 5aca693cce4a5ea131ac383909da542ecb309576..4dd2e627e773bc27878394a1e1a56a30ca5f1885 100644 (file)
@@ -76,6 +76,12 @@ struct relay_stream {
         * timestamp end, when it is active, this field == -1ULL.
         */
        uint64_t beacon_ts_end;
+       /*
+        * Number of indexes that are supposed to be complete soon.
+        * Avoid sending the inactivity beacon to the client when data is in
+        * transit.
+        */
+       int indexes_in_flight;
        /*
         * CTF stream ID, -1ULL when unset.
         */
This page took 0.028439 seconds and 5 git commands to generate.