From: Julien Desfossez Date: Wed, 27 Aug 2014 17:59:21 +0000 (-0400) Subject: Fix: make sure no index is in flight before using inactivity beacons X-Git-Tag: v2.6.0-rc1~69 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=6e7241fe92e7b5db872d164c3e1a0f75ce5a1463;hp=c4fd489fe80828d8eaa1cca7f25ae87ebb6d77f5 Fix: make sure no index is in flight before using inactivity beacons 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 Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index a3b8016db..fa5a7db86 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -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: diff --git a/src/bin/lttng-relayd/stream.h b/src/bin/lttng-relayd/stream.h index 5aca693cc..4dd2e627e 100644 --- a/src/bin/lttng-relayd/stream.h +++ b/src/bin/lttng-relayd/stream.h @@ -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. */