From: Julien Desfossez Date: Tue, 9 Jan 2018 22:12:54 +0000 (-0500) Subject: Fix: lttng-live discarded event count after inactivity X-Git-Tag: v1.4.4~13 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=c0bed13943846ef9b60b22b88401741e918281ce Fix: lttng-live discarded event count after inactivity When a stream is inactive, the consumer produces fake indexes which are beacons to let the viewer know a stream has not produced any data up to a certain timestamp. These beacon are actually real packet indexes with all the fields set to 0 except for the timestamp_end. Currently we keep these beacons just like we keep real indexes. The problem is that when we switch packet, we compare the events_discarded field in the index we just received with the same field in the previous index. In the case where a stream has been inactive, we have received inactivity beacons, and set the discarded_event field to 0, so the difference with the next real index might be wrong. In fact, since the inactivity beacons are only used to push the timestamp end of a stream, we don't need to keep them and we actually need to keep most of the data from the real previous index. So we now copy the entire prev_index into the cur_index when we receive an inactivity beacon. We could refactor the code to avoid performing the pointer swap of cur and prev indexes, but this implies a redesign of much of the packet switching code which would affect other code paths. Signed-off-by: Julien Desfossez Signed-off-by: Jérémie Galarneau --- diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 77bf34ac..2b793e5f 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -1276,14 +1276,30 @@ retry: } if (cur_index->content_size == 0) { + /* Beacon packet index */ if (file_stream->parent.stream_class) { file_stream->parent.cycles_timestamp = cur_index->ts_cycles.timestamp_end; file_stream->parent.real_timestamp = ctf_get_real_timestamp( &file_stream->parent, cur_index->ts_cycles.timestamp_end); + + /* + * Duplicate the data from the previous index, because + * the one we just received is only a beacon with no + * relevant information except the timestamp_end. We + * don't need to keep this timestamp_end because we already + * updated the file_stream timestamps, so we only need + * to keep the last real index data as prev_index. That + * way, we keep the original prev timestamps and + * discarded events counter. This is the same behaviour + * as if we were reading a local trace, we would not + * have fake indexes between real indexes. + */ + memcpy(cur_index, prev_index, sizeof(struct packet_index)); } } else { + /* Real packet index */ if (file_stream->parent.stream_class) { /* Convert the timestamps and append to the real_index. */ cur_index->ts_real.timestamp_begin = ctf_get_real_timestamp(