Fix UST channel/stream output assignation
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index 29ef3a4ce426d1db8755796fdafffceed43525b6..5b05d9f6b6d4e9d9b0c588700def21dc5fa06cfe 100644 (file)
@@ -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;
This page took 0.024487 seconds and 4 git commands to generate.