X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Flttng-live%2Flttng-live.cpp;fp=src%2Fplugins%2Fctf%2Flttng-live%2Flttng-live.cpp;h=e87de8d47aa18660ceb3540e46b1cfaeef4198f1;hp=63fc173f689cd20f956ba2ba6810cf3e6bc7fa8e;hb=a4f118a39fb7e83c0160ad5850d99180d29e95e9;hpb=e1f49fd06b3b55ba81d5df0adddd18781b0940e6 diff --git a/src/plugins/ctf/lttng-live/lttng-live.cpp b/src/plugins/ctf/lttng-live/lttng-live.cpp index 63fc173f..e87de8d4 100644 --- a/src/plugins/ctf/lttng-live/lttng-live.cpp +++ b/src/plugins/ctf/lttng-live/lttng-live.cpp @@ -481,15 +481,42 @@ lttng_live_get_session(struct lttng_live_msg_iter *lttng_live_msg_iter, } } - BT_COMP_LOGD("Updating all streams and metadata for session: " + BT_COMP_LOGD("Updating all data streams: " "session-id=%" PRIu64 ", session-name=\"%s\"", session->id, session->session_name->str); status = lttng_live_session_get_new_streams(session, lttng_live_msg_iter->self_msg_iter); - if (status != LTTNG_LIVE_ITERATOR_STATUS_OK && status != LTTNG_LIVE_ITERATOR_STATUS_END) { + switch (status) { + case LTTNG_LIVE_ITERATOR_STATUS_OK: + break; + case LTTNG_LIVE_ITERATOR_STATUS_END: + /* + * We received a `_END` from the `_get_new_streams()` function, + * which means no more data will ever be received from the data + * streams of this session. But it's possible that the metadata + * is incomplete. + * The live protocol guarantees that we receive all the + * metadata needed before we receive data streams needing it. + * But it's possible to receive metadata NOT needed by + * data streams after the session was closed. For example, this + * could happen if a new event is registered and the session is + * stopped before any tracepoint for that event is actually + * fired. + */ + BT_COMP_LOGD( + "Updating streams returned _END status. Override status to _OK in order fetch any remaining metadata:" + "session-id=%" PRIu64 ", session-name=\"%s\"", + session->id, session->session_name->str); + status = LTTNG_LIVE_ITERATOR_STATUS_OK; + break; + default: goto end; } + BT_COMP_LOGD("Updating metadata stream for session: " + "session-id=%" PRIu64 ", session-name=\"%s\"", + session->id, session->session_name->str); + trace_idx = 0; while (trace_idx < session->traces->len) { struct lttng_live_trace *trace = @@ -608,6 +635,11 @@ lttng_live_iterator_handle_new_streams_and_metadata(struct lttng_live_msg_iter * switch (status) { case LTTNG_LIVE_ITERATOR_STATUS_OK: case LTTNG_LIVE_ITERATOR_STATUS_END: + /* + * A session returned `_END`. Other sessions may still + * be active so we override the status and continue + * looping if needed. + */ break; default: goto end;