From: Mathieu Desnoyers Date: Thu, 12 Dec 2019 18:09:18 +0000 (-0500) Subject: Fix: consumer: do not flush on transition from NULL chunk X-Git-Tag: v2.12.0-rc1~158 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=a9dde553270b4e8f3f280706e3f19f8f3ac41e1b;hp=5416a504a1ff9f2444e594084836dc8b59739526;ds=sidebyside Fix: consumer: do not flush on transition from NULL chunk When transitioning from NULL chunk, do not flush streams, because the consumer has nowhere to store the packets generated by this flush. Signed-off-by: Mathieu Desnoyers Change-Id: Ic92c035f6b1377849825527d0c9cc05a6b92ac38 Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/consumer/consumer.c b/src/common/consumer/consumer.c index 5a39a0cc7..fbbe8ea8f 100644 --- a/src/common/consumer/consumer.c +++ b/src/common/consumer/consumer.c @@ -4025,14 +4025,23 @@ int lttng_consumer_rotate_channel(struct lttng_consumer_channel *channel, } /* - * Active flush; has no effect if the production position - * is at a packet boundary. + * Do not flush an empty packet when rotating from a NULL trace + * chunk. The stream has no means to output data, and the prior + * rotation which rotated to NULL performed that side-effect already. */ - ret = consumer_flush_buffer(stream, 1); - if (ret < 0) { - ERR("Failed to flush stream %" PRIu64 " during channel rotation", - stream->key); - goto end_unlock_stream; + if (stream->trace_chunk) { + /* + * For metadata stream, do an active flush, which does not + * produce empty packets. For data streams, empty-flush; + * ensures we have at least one packet in each stream per trace + * chunk, even if no data was produced. + */ + ret = consumer_flush_buffer(stream, stream->metadata_flag ? 1 : 0); + if (ret < 0) { + ERR("Failed to flush stream %" PRIu64 " during channel rotation", + stream->key); + goto end_unlock_stream; + } } ret = lttng_consumer_take_snapshot(stream);