X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fkernel-consumer%2Fkernel-consumer.c;h=5b05d9f6b6d4e9d9b0c588700def21dc5fa06cfe;hb=dd77053051a5f130fd13e41c5d91e42bcb02d288;hp=29ef3a4ce426d1db8755796fdafffceed43525b6;hpb=07b86b528dc279d59cdf16e6cb946c144fe773f2;p=lttng-tools.git diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c index 29ef3a4ce..5b05d9f6b 100644 --- a/src/common/kernel-consumer/kernel-consumer.c +++ b/src/common/kernel-consumer/kernel-consumer.c @@ -350,7 +350,7 @@ end: * Returns 0 on success, < 0 on error */ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path, - struct lttng_consumer_local_data *ctx) + uint64_t relayd_id, struct lttng_consumer_local_data *ctx) { struct lttng_consumer_channel *metadata_channel; struct lttng_consumer_stream *metadata_stream; @@ -371,14 +371,22 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path, metadata_stream = metadata_channel->metadata_stream; assert(metadata_stream); - ret = utils_create_stream_file(path, metadata_stream->name, - metadata_stream->chan->tracefile_size, - metadata_stream->tracefile_count_current, - metadata_stream->uid, metadata_stream->gid); - if (ret < 0) { - goto end; + if (relayd_id != (uint64_t) -1ULL) { + ret = send_relayd_stream(metadata_stream, path); + if (ret < 0) { + ERR("sending stream to relayd"); + } + DBG("Stream %s sent to the relayd", metadata_stream->name); + } else { + ret = utils_create_stream_file(path, metadata_stream->name, + metadata_stream->chan->tracefile_size, + metadata_stream->tracefile_count_current, + metadata_stream->uid, metadata_stream->gid); + if (ret < 0) { + goto end; + } + metadata_stream->out_fd = ret; } - metadata_stream->out_fd = ret; ret = 0; while (ret >= 0) { @@ -393,6 +401,18 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path, } } + if (relayd_id == (uint64_t) -1ULL) { + ret = close(metadata_stream->out_fd); + if (ret < 0) { + PERROR("Kernel consumer snapshot close out_fd"); + goto end; + } + metadata_stream->out_fd = -1; + } else { + close_relayd_stream(metadata_stream); + metadata_stream->net_seq_idx = (uint64_t) -1ULL; + } + ret = 0; end: rcu_read_unlock(); @@ -460,13 +480,24 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, msg.u.channel.name, msg.u.channel.uid, msg.u.channel.gid, msg.u.channel.relayd_id, msg.u.channel.output, msg.u.channel.tracefile_size, - msg.u.channel.tracefile_count, + msg.u.channel.tracefile_count, 0, msg.u.channel.monitor); if (new_channel == NULL) { lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR); goto end_nosignal; } new_channel->nb_init_stream_left = msg.u.channel.nb_init_streams; + switch (msg.u.channel.output) { + case LTTNG_EVENT_SPLICE: + new_channel->output = CONSUMER_CHANNEL_SPLICE; + break; + case LTTNG_EVENT_MMAP: + new_channel->output = CONSUMER_CHANNEL_MMAP; + break; + default: + ERR("Channel output unknown %d", msg.u.channel.output); + goto end_nosignal; + } /* Translate and save channel type. */ switch (msg.u.channel.type) { @@ -619,12 +650,6 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, */ new_stream->hangup_flush_done = 0; - ret = send_relayd_stream(new_stream, NULL); - if (ret < 0) { - consumer_del_stream(new_stream, NULL); - goto end_nosignal; - } - if (ctx->on_recv_stream) { ret = ctx->on_recv_stream(new_stream); if (ret < 0) { @@ -647,6 +672,12 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, break; } + ret = send_relayd_stream(new_stream, NULL); + if (ret < 0) { + consumer_del_stream(new_stream, NULL); + goto end_nosignal; + } + /* Get the right pipe where the stream will be sent. */ if (new_stream->metadata_flag) { stream_pipe = ctx->consumer_metadata_pipe; @@ -734,7 +765,8 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, { if (msg.u.snapshot_channel.metadata == 1) { ret = lttng_kconsumer_snapshot_metadata(msg.u.snapshot_channel.key, - msg.u.snapshot_channel.pathname, ctx); + msg.u.snapshot_channel.pathname, + msg.u.snapshot_channel.relayd_id, ctx); if (ret < 0) { ERR("Snapshot metadata failed"); ret_code = LTTNG_ERR_KERN_META_FAIL;