From ffcc54c06504391350392119a7bee9049e28130b Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Mon, 13 Jul 2020 17:45:35 -0400 Subject: [PATCH] Fix: src.ctf.lttng-live: consider empty metadata packet as retry MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When clearing a live session, it's possible for the Relay to know that metadata is available even though it has not yet received it from the consumer. In such cases, the relay will send a `LTTNG_VIEWER_METADATA_OK` reply with a zero length metadata packet. The viewer needs to interpret that as "please try again later". In fact, the viewer needs to keep requesting metadata from the relay until it receives either a `LTTNG_VIEWER_NO_NEW_METADATA` status or an error status. Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau Change-Id: Ief33f1a43ec827e211a2f4f2ace623e9d3254246 Reviewed-on: https://review.lttng.org/c/babeltrace/+/7392 --- src/plugins/ctf/lttng-live/viewer-connection.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/ctf/lttng-live/viewer-connection.c b/src/plugins/ctf/lttng-live/viewer-connection.c index 0a3f5018..f21dc21c 100644 --- a/src/plugins/ctf/lttng-live/viewer-connection.c +++ b/src/plugins/ctf/lttng-live/viewer-connection.c @@ -1316,14 +1316,18 @@ enum lttng_live_get_one_metadata_status lttng_live_get_one_metadata_packet( } len = be64toh(rp.len); - BT_COMP_LOGD("Writing %" PRIu64" bytes to metadata", len); - if (len <= 0) { - BT_COMP_LOGE_APPEND_CAUSE(self_comp, - "Erroneous response length"); - status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_ERROR; - goto end; + if (len == 0) { + /* + * We received a `LTTNG_VIEWER_METADATA_OK` with a packet + * length of 0. This means we must try again. This scenario + * arises when a clear command is performed on an lttng session. + */ + BT_COMP_LOGD("Expecting a metadata packet of size 0. Retry to get a packet from the relay."); + goto empty_metadata_packet_retry; } + BT_COMP_LOGD("Writing %" PRIu64" bytes to metadata", len); + data = g_new0(gchar, len); if (!data) { BT_COMP_LOGE_APPEND_CAUSE_ERRNO(self_comp, @@ -1351,6 +1355,7 @@ enum lttng_live_get_one_metadata_status lttng_live_get_one_metadata_packet( goto end; } +empty_metadata_packet_retry: *reply_len = len; status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK; -- 2.34.1