Fix: src.ctf.lttng-live: consider empty metadata packet as retry
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Thu, 24 Feb 2022 21:51:50 +0000 (16:51 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 24 Feb 2022 23:23:50 +0000 (18:23 -0500)
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 <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ief33f1a43ec827e211a2f4f2ace623e9d3254246
Reviewed-on: https://review.lttng.org/c/babeltrace/+/3763

src/plugins/ctf/lttng-live/viewer-connection.cpp

index 804a88d87d7f61337f8827ef360a3cd107a0a04c..7960b50e685299c9406bdab96652c44176f1c4ca 100644 (file)
@@ -1288,6 +1288,17 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
     }
 
     len = be64toh(rp.len);
+    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);
     if (len <= 0) {
         BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Erroneous response length");
@@ -1319,6 +1330,7 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
         goto end;
     }
 
+empty_metadata_packet_retry:
     *reply_len = len;
     status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK;
 
This page took 0.025055 seconds and 4 git commands to generate.