X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Flttng-live%2Flttng-live-comm.c;h=785f5f37022609a702cddf3341e20b32611d0d1c;hb=b7e8a8e17de9b9e5b717d8b664b8385a2562aee8;hp=1cba2c610f8827806e5068ad16ec350187f2c8b7;hpb=9abca178d4d5748e883a8f14df4b6d1b91bb9df5;p=babeltrace.git diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 1cba2c61..785f5f37 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -49,6 +49,8 @@ #include #include +#include + #include "lttng-live.h" #include "lttng-viewer-abi.h" @@ -67,7 +69,40 @@ static void ctf_live_packet_seek(struct bt_stream_pos *stream_pos, static void add_traces(gpointer key, gpointer value, gpointer user_data); static int del_traces(gpointer key, gpointer value, gpointer user_data); static int get_new_metadata(struct lttng_live_ctx *ctx, - struct lttng_live_viewer_stream *viewer_stream); + struct lttng_live_viewer_stream *viewer_stream, + char **metadata_buf); + +static +ssize_t lttng_live_recv(int fd, void *buf, size_t len) +{ + ssize_t ret; + size_t copied = 0, to_copy = len; + + do { + ret = recv(fd, buf + copied, to_copy, 0); + if (ret > 0) { + assert(ret <= to_copy); + copied += ret; + to_copy -= ret; + } + } while ((ret > 0 && to_copy > 0) + || (ret < 0 && errno == EINTR)); + if (ret > 0) + ret = copied; + /* ret = 0 means orderly shutdown, ret < 0 is error. */ + return ret; +} + +static +ssize_t lttng_live_send(int fd, const void *buf, size_t len) +{ + ssize_t ret; + + do { + ret = send(fd, buf, len, MSG_NOSIGNAL); + } while (ret < 0 && errno == EINTR); + return ret; +} int lttng_live_connect_viewer(struct lttng_live_ctx *ctx) { @@ -121,9 +156,7 @@ int lttng_live_establish_connection(struct lttng_live_ctx *ctx) connect.minor = htobe32(LTTNG_LIVE_MINOR); connect.type = htobe32(LTTNG_VIEWER_CLIENT_COMMAND); - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -131,9 +164,7 @@ int lttng_live_establish_connection(struct lttng_live_ctx *ctx) } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &connect, sizeof(connect), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &connect, sizeof(connect)); if (ret_len < 0) { perror("[error] Error sending version"); ret = ret_len; @@ -141,9 +172,7 @@ int lttng_live_establish_connection(struct lttng_live_ctx *ctx) } assert(ret_len == sizeof(connect)); - do { - ret_len = recv(ctx->control_sock, &connect, sizeof(connect), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &connect, sizeof(connect)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -248,9 +277,7 @@ int lttng_live_list_sessions(struct lttng_live_ctx *ctx, const char *path) cmd.data_size = 0; cmd.cmd_version = 0; - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -258,9 +285,7 @@ int lttng_live_list_sessions(struct lttng_live_ctx *ctx, const char *path) } assert(ret_len == sizeof(cmd)); - do { - ret_len = recv(ctx->control_sock, &list, sizeof(list), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &list, sizeof(list)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -275,9 +300,7 @@ int lttng_live_list_sessions(struct lttng_live_ctx *ctx, const char *path) sessions_count = be32toh(list.sessions_count); for (i = 0; i < sessions_count; i++) { - do { - ret_len = recv(ctx->control_sock, &lsession, sizeof(lsession), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &lsession, sizeof(lsession)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -348,6 +371,22 @@ int lttng_live_ctf_trace_assign(struct lttng_live_viewer_stream *stream, return ret; } +static +int open_metadata_fp_write(struct lttng_live_viewer_stream *stream, + char **metadata_buf, size_t *size) +{ + int ret = 0; + + stream->metadata_fp_write = + babeltrace_open_memstream(metadata_buf, size); + if (!stream->metadata_fp_write) { + perror("Metadata open_memstream"); + ret = -1; + } + + return ret; +} + int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) { struct lttng_viewer_cmd cmd; @@ -367,9 +406,7 @@ int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) // rq.seek = htobe32(LTTNG_VIEWER_SEEK_BEGINNING); rq.seek = htobe32(LTTNG_VIEWER_SEEK_LAST); - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -377,9 +414,7 @@ int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &rq, sizeof(rq), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &rq, sizeof(rq)); if (ret_len < 0) { perror("[error] Error sending attach request"); ret = ret_len; @@ -387,9 +422,7 @@ int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) } assert(ret_len == sizeof(rq)); - do { - ret_len = recv(ctx->control_sock, &rp, sizeof(rp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &rp, sizeof(rp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -446,9 +479,7 @@ int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) ctx->session->streams = g_new0(struct lttng_live_viewer_stream, ctx->session->stream_count); for (i = 0; i < be32toh(rp.streams_count); i++) { - do { - ret_len = recv(ctx->control_sock, &stream, sizeof(stream), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &stream, sizeof(stream)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -473,35 +504,7 @@ int lttng_live_attach_session(struct lttng_live_ctx *ctx, uint64_t id) ctx->session->streams[i].mmap_size = 0; if (be32toh(stream.metadata_flag)) { - char *path; - - path = strdup(LTTNG_METADATA_PATH_TEMPLATE); - if (!path) { - perror("strdup"); - ret = -1; - goto error; - } - if (!mkdtemp(path)) { - perror("mkdtemp"); - free(path); - ret = -1; - goto error; - } ctx->session->streams[i].metadata_flag = 1; - snprintf(ctx->session->streams[i].path, - sizeof(ctx->session->streams[i].path), - "%s/%s", path, - stream.channel_name); - ret = open(ctx->session->streams[i].path, - O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); - if (ret < 0) { - perror("open"); - free(path); - goto error; - } - ctx->session->streams[i].fd = ret; - free(path); } ret = lttng_live_ctf_trace_assign(&ctx->session->streams[i], be64toh(stream.ctf_trace_id)); @@ -555,6 +558,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, @@ -567,6 +607,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; @@ -577,9 +618,7 @@ int get_data_packet(struct lttng_live_ctx *ctx, rq.offset = offset; rq.len = htobe32(len); - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -587,9 +626,7 @@ int get_data_packet(struct lttng_live_ctx *ctx, } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &rq, sizeof(rq), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &rq, sizeof(rq)); if (ret_len < 0) { perror("[error] Error sending get_data_packet request"); ret = ret_len; @@ -597,9 +634,7 @@ int get_data_packet(struct lttng_live_ctx *ctx, } assert(ret_len == sizeof(rq)); - do { - ret_len = recv(ctx->control_sock, &rp, sizeof(rp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &rp, sizeof(rp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -633,8 +668,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); @@ -690,11 +727,8 @@ int get_data_packet(struct lttng_live_ctx *ctx, stream->mmap_size); } - do { - ret_len = recv(ctx->control_sock, - mmap_align_addr(pos->base_mma), len, - MSG_WAITALL); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, + mmap_align_addr(pos->base_mma), len); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -729,9 +763,7 @@ int get_one_metadata_packet(struct lttng_live_ctx *ctx, cmd.data_size = sizeof(rq); cmd.cmd_version = 0; - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -739,9 +771,7 @@ int get_one_metadata_packet(struct lttng_live_ctx *ctx, } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &rq, sizeof(rq), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &rq, sizeof(rq)); if (ret_len < 0) { perror("[error] Error sending get_metadata request"); ret = ret_len; @@ -749,9 +779,7 @@ int get_one_metadata_packet(struct lttng_live_ctx *ctx, } assert(ret_len == sizeof(rq)); - do { - ret_len = recv(ctx->control_sock, &rp, sizeof(rp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &rp, sizeof(rp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -795,9 +823,7 @@ int get_one_metadata_packet(struct lttng_live_ctx *ctx, ret = -1; goto error; } - do { - ret_len = recv(ctx->control_sock, data, len, MSG_WAITALL); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, data, len); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -813,14 +839,17 @@ int get_one_metadata_packet(struct lttng_live_ctx *ctx, assert(ret_len == len); do { - ret_len = write(metadata_stream->fd, data, len); + ret_len = fwrite(data, 1, len, + metadata_stream->metadata_fp_write); } while (ret_len < 0 && errno == EINTR); if (ret_len < 0) { + fprintf(stderr, "[error] Writing in the metadata fp\n"); free(data); ret = ret_len; goto error; } assert(ret_len == len); + metadata_stream->metadata_len += len; ret = len; free(data); @@ -835,12 +864,24 @@ error: */ static int get_new_metadata(struct lttng_live_ctx *ctx, - struct lttng_live_viewer_stream *viewer_stream) + struct lttng_live_viewer_stream *viewer_stream, + char **metadata_buf) { int ret = 0; struct lttng_live_viewer_stream *metadata_stream; + 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) { + goto error; + } do { /* @@ -851,6 +892,11 @@ int get_new_metadata(struct lttng_live_ctx *ctx, ret = get_one_metadata_packet(ctx, metadata_stream); } while (ret > 0); + if (fclose(metadata_stream->metadata_fp_write)) + perror("fclose"); + metadata_stream->metadata_fp_write = NULL; + +error: return ret; } @@ -878,9 +924,7 @@ int get_next_index(struct lttng_live_ctx *ctx, rq.stream_id = htobe64(viewer_stream->id); retry: - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -888,9 +932,7 @@ retry: } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &rq, sizeof(rq), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &rq, sizeof(rq)); if (ret_len < 0) { perror("[error] Error sending get_next_index request"); ret = ret_len; @@ -898,9 +940,7 @@ retry: } assert(ret_len == sizeof(rq)); - do { - ret_len = recv(ctx->control_sock, &rp, sizeof(rp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &rp, sizeof(rp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -932,11 +972,9 @@ retry: index->events_discarded = be64toh(rp.events_discarded); if (rp.flags & LTTNG_VIEWER_FLAG_NEW_METADATA) { - printf_verbose("get_next_index: new metadata needed\n"); - ret = get_new_metadata(ctx, viewer_stream); - if (ret < 0) { + ret = append_metadata(ctx, viewer_stream); + if (ret) goto error; - } } if (rp.flags & LTTNG_VIEWER_FLAG_NEW_STREAM) { ret = ask_new_streams(ctx); @@ -953,7 +991,6 @@ retry: case LTTNG_VIEWER_INDEX_HUP: printf_verbose("get_next_index: stream hung up\n"); viewer_stream->id = -1ULL; - viewer_stream->fd = -1; index->offset = EOF; ctx->session->stream_count--; break; @@ -1118,9 +1155,7 @@ int lttng_live_create_viewer_session(struct lttng_live_ctx *ctx) cmd.data_size = 0; cmd.cmd_version = 0; - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -1128,9 +1163,7 @@ int lttng_live_create_viewer_session(struct lttng_live_ctx *ctx) } assert(ret_len == sizeof(cmd)); - do { - ret_len = recv(ctx->control_sock, &resp, sizeof(resp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &resp, sizeof(resp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -1179,6 +1212,8 @@ void add_traces(gpointer key, gpointer value, gpointer user_data) struct bt_mmap_stream *new_mmap_stream; struct bt_mmap_stream_list mmap_list; struct lttng_live_ctx *ctx = NULL; + struct bt_trace_descriptor *td; + struct bt_trace_handle *handle; /* * We don't know how many streams we will receive for a trace, so @@ -1204,11 +1239,29 @@ void add_traces(gpointer key, gpointer value, gpointer user_data) new_mmap_stream->fd = -1; bt_list_add(&new_mmap_stream->list, &mmap_list.head); } else { + char *metadata_buf = NULL; + /* Get all possible metadata before starting */ - ret = get_new_metadata(ctx, stream); - if (ret) + ret = get_new_metadata(ctx, stream, &metadata_buf); + if (ret) { + free(metadata_buf); + goto end_free; + } + if (!stream->metadata_len) { + fprintf(stderr, "[error] empty metadata\n"); + ret = -1; + free(metadata_buf); + goto end_free; + } + + trace->metadata_fp = babeltrace_fmemopen(metadata_buf, + stream->metadata_len, "rb"); + if (!trace->metadata_fp) { + perror("Metadata fmemopen"); + ret = -1; + free(metadata_buf); goto end_free; - trace->metadata_fp = fopen(stream->path, "r"); + } } } @@ -1223,15 +1276,14 @@ void add_traces(gpointer key, gpointer value, gpointer user_data) fprintf(stderr, "[error] Error adding trace\n"); goto end_free; } + trace->metadata_stream->metadata_len = 0; + handle = (struct bt_trace_handle *) g_hash_table_lookup( + bt_ctx->trace_handles, + (gpointer) (unsigned long) ret); + td = handle->td; + trace->handle = handle; if (bt_ctx->current_iterator) { - struct bt_trace_descriptor *td; - struct bt_trace_handle *handle; - - handle = (struct bt_trace_handle *) g_hash_table_lookup( - bt_ctx->trace_handles, - (gpointer) (unsigned long) ret); - td = handle->td; bt_iter_add_trace(bt_ctx->current_iterator, td); } @@ -1263,9 +1315,7 @@ int lttng_live_get_new_streams(struct lttng_live_ctx *ctx, uint64_t id) memset(&rq, 0, sizeof(rq)); rq.session_id = htobe64(id); - do { - ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &cmd, sizeof(cmd)); if (ret_len < 0) { perror("[error] Error sending cmd"); ret = ret_len; @@ -1273,9 +1323,7 @@ int lttng_live_get_new_streams(struct lttng_live_ctx *ctx, uint64_t id) } assert(ret_len == sizeof(cmd)); - do { - ret_len = send(ctx->control_sock, &rq, sizeof(rq), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_send(ctx->control_sock, &rq, sizeof(rq)); if (ret_len < 0) { perror("[error] Error sending get_new_streams request"); ret = ret_len; @@ -1283,9 +1331,7 @@ int lttng_live_get_new_streams(struct lttng_live_ctx *ctx, uint64_t id) } assert(ret_len == sizeof(rq)); - do { - ret_len = recv(ctx->control_sock, &rp, sizeof(rp), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &rp, sizeof(rp)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -1334,9 +1380,7 @@ int lttng_live_get_new_streams(struct lttng_live_ctx *ctx, uint64_t id) ctx->session->streams = g_new0(struct lttng_live_viewer_stream, ctx->session->stream_count); for (i = 0; i < stream_count; i++) { - do { - ret_len = recv(ctx->control_sock, &stream, sizeof(stream), 0); - } while (ret_len < 0 && errno == EINTR); + ret_len = lttng_live_recv(ctx->control_sock, &stream, sizeof(stream)); if (ret_len == 0) { fprintf(stderr, "[error] Remote side has closed connection\n"); ret = -1; @@ -1361,35 +1405,7 @@ int lttng_live_get_new_streams(struct lttng_live_ctx *ctx, uint64_t id) ctx->session->streams[i].mmap_size = 0; if (be32toh(stream.metadata_flag)) { - char *path; - - path = strdup(LTTNG_METADATA_PATH_TEMPLATE); - if (!path) { - perror("strdup"); - ret = -1; - goto error; - } - if (!mkdtemp(path)) { - perror("mkdtemp"); - free(path); - ret = -1; - goto error; - } ctx->session->streams[i].metadata_flag = 1; - snprintf(ctx->session->streams[i].path, - sizeof(ctx->session->streams[i].path), - "%s/%s", path, - stream.channel_name); - ret = open(ctx->session->streams[i].path, - O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); - if (ret < 0) { - perror("open"); - free(path); - goto error; - } - ctx->session->streams[i].fd = ret; - free(path); } ret = lttng_live_ctf_trace_assign(&ctx->session->streams[i], be64toh(stream.ctf_trace_id));