X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Flive.c;h=1b25671d5f76a82ad83a33ceceb3691e8794457c;hb=cc280027af4d65437a30613bb63421ae8d7b199a;hp=6c1dbcd36763f5c7309ab4e5b08d12c1fd528860;hpb=123ed7c220e544fb81eb3561d885c296665fef39;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c index 6c1dbcd36..1b25671d5 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -338,7 +338,8 @@ static int make_viewer_streams(struct relay_session *session, */ if (!trace_has_metadata_stream && !ctf_trace->metadata_stream_sent_to_viewer) { - break; + ctf_trace_put(ctf_trace); + continue; } cds_list_for_each_entry_rcu(stream, &ctf_trace->stream_list, stream_node) { @@ -1723,7 +1724,23 @@ int viewer_get_metadata(struct relay_connection *conn) len = vstream->stream->metadata_received - vstream->metadata_sent; if (len == 0) { + /* + * The live viewers expect to receive a NO_NEW_METADATA + * status before a stream disappears, otherwise they abort the + * entire live connection when receiving an error status. + */ reply.status = htobe32(LTTNG_VIEWER_NO_NEW_METADATA); + /* + * The live viewer considers a closed 0 byte metadata stream as + * an error. + */ + if (vstream->metadata_sent > 0) { + vstream->stream->no_new_metadata_notified = true; + if (vstream->stream->closed) { + /* Release ownership for the viewer metadata stream. */ + viewer_stream_put(vstream); + } + } goto send_reply; } @@ -1771,12 +1788,6 @@ int viewer_get_metadata(struct relay_connection *conn) goto error; } vstream->metadata_sent += read_len; - if (vstream->metadata_sent == vstream->stream->metadata_received - && vstream->stream->closed) { - /* Release ownership for the viewer metadata stream. */ - viewer_stream_put(vstream); - } - reply.status = htobe32(LTTNG_VIEWER_METADATA_OK); goto send_reply;