From 50d207af3c6ca4f0a7039454cd4c3f57e2119c9c Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Thu, 20 Feb 2014 00:50:27 -0500 Subject: [PATCH] Fix: call to append metadata when new metadata is added Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- formats/lttng-live/lttng-live-comm.c | 67 ++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 7076f9c5..a53f6c3a 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -546,6 +546,43 @@ end: return ret; } +static +int append_metadata(struct lttng_live_ctx *ctx, + struct lttng_live_viewer_stream *viewer_stream) +{ + int ret; + struct lttng_live_viewer_stream *metadata; + char *metadata_buf = NULL; + + printf_verbose("get_next_index: new metadata needed\n"); + ret = get_new_metadata(ctx, viewer_stream, &metadata_buf); + if (ret < 0) { + free(metadata_buf); + goto error; + } + + metadata = viewer_stream->ctf_trace->metadata_stream; + metadata->ctf_trace->metadata_fp = + babeltrace_fmemopen(metadata_buf, + metadata->metadata_len, "rb"); + if (!metadata->ctf_trace->metadata_fp) { + perror("Metadata fmemopen"); + free(metadata_buf); + ret = -1; + goto error; + } + ret = ctf_append_trace_metadata( + viewer_stream->ctf_trace->handle->td, + metadata->ctf_trace->metadata_fp); + if (ret != 0) { + fprintf(stderr, "[error] Appending metadata\n"); + goto error; + } + +error: + return ret; +} + static int get_data_packet(struct lttng_live_ctx *ctx, struct ctf_stream_pos *pos, @@ -558,6 +595,7 @@ int get_data_packet(struct lttng_live_ctx *ctx, ssize_t ret_len; int ret; +retry: cmd.cmd = htobe32(LTTNG_VIEWER_GET_PACKET); cmd.data_size = sizeof(rq); cmd.cmd_version = 0; @@ -624,8 +662,10 @@ int get_data_packet(struct lttng_live_ctx *ctx, case LTTNG_VIEWER_GET_PACKET_ERR: if (rp.flags & LTTNG_VIEWER_FLAG_NEW_METADATA) { printf_verbose("get_data_packet: new metadata needed\n"); - ret = 0; - goto end; + ret = append_metadata(ctx, stream); + if (ret) + goto error; + goto retry; } if (rp.flags & LTTNG_VIEWER_FLAG_NEW_STREAM) { ret = ask_new_streams(ctx); @@ -837,6 +877,11 @@ int get_new_metadata(struct lttng_live_ctx *ctx, size_t size; metadata_stream = viewer_stream->ctf_trace->metadata_stream; + if (!metadata_stream) { + fprintf(stderr, "[error] No metadata stream\n"); + ret = -1; + goto error; + } metadata_stream->metadata_len = 0; ret = open_metadata_fp_write(metadata_stream, metadata_buf, &size); if (ret < 0) { @@ -937,23 +982,9 @@ retry: index->events_discarded = be64toh(rp.events_discarded); if (rp.flags & LTTNG_VIEWER_FLAG_NEW_METADATA) { - struct lttng_live_viewer_stream *metadata; - char *metadata_buf = NULL; - - printf_verbose("get_next_index: new metadata needed\n"); - ret = get_new_metadata(ctx, viewer_stream, &metadata_buf); - if (ret < 0) { - goto error; - } - metadata = viewer_stream->ctf_trace->metadata_stream; - metadata->ctf_trace->metadata_fp = - babeltrace_fmemopen(metadata_buf, - metadata->metadata_len, "rb"); - if (!metadata->ctf_trace->metadata_fp) { - perror("Metadata fmemopen"); - ret = -1; + ret = append_metadata(ctx, viewer_stream); + if (ret) goto error; - } } if (rp.flags & LTTNG_VIEWER_FLAG_NEW_STREAM) { ret = ask_new_streams(ctx); -- 2.34.1