Fix: put subbuffer back in kernel snapshot error path
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index 84be2db463fb0b8cd8a3a6107fd321531eef2aa9..a68438253c9d694a6d29d7267b1da50548ad4172 100644 (file)
@@ -204,6 +204,10 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
                 */
                pthread_mutex_lock(&stream->lock);
 
+               /*
+                * Assign the received relayd ID so we can use it for streaming. The streams
+                * are not visible to anyone so this is OK to change it.
+                */
                stream->net_seq_idx = relayd_id;
                channel->relayd_id = relayd_id;
                if (relayd_id != (uint64_t) -1ULL) {
@@ -282,22 +286,21 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
                        ret = kernctl_get_subbuf_size(stream->wait_fd, &len);
                        if (ret < 0) {
                                ERR("Snapshot kernctl_get_subbuf_size");
-                               goto end_unlock;
+                               goto error_put_subbuf;
                        }
 
                        ret = kernctl_get_padded_subbuf_size(stream->wait_fd, &padded_len);
                        if (ret < 0) {
                                ERR("Snapshot kernctl_get_padded_subbuf_size");
-                               goto end_unlock;
+                               goto error_put_subbuf;
                        }
 
                        read_len = lttng_consumer_on_read_subbuffer_mmap(ctx, stream, len,
                                        padded_len - len);
                        /*
-                        * We write the padded len in local tracefiles but the
-                        * data len when using a relay.
-                        * Display the error but continue processing to try to
-                        * release the subbuffer.
+                        * We write the padded len in local tracefiles but the data len
+                        * when using a relay. Display the error but continue processing
+                        * to try to release the subbuffer.
                         */
                        if (relayd_id != (uint64_t) -1ULL) {
                                if (read_len != len) {
@@ -337,6 +340,11 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
        ret = 0;
        goto end;
 
+error_put_subbuf:
+       ret = kernctl_put_subbuf(stream->wait_fd);
+       if (ret < 0) {
+               ERR("Snapshot kernctl_put_subbuf error path");
+       }
 end_unlock:
        pthread_mutex_unlock(&stream->lock);
 end:
@@ -480,13 +488,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) {
@@ -653,9 +672,9 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                /* Do not monitor this stream. */
                if (!channel->monitor) {
-                       DBG("Kernel consumer add stream %s in no monitor mode with"
+                       DBG("Kernel consumer add stream %s in no monitor mode with "
                                        "relayd id %" PRIu64, new_stream->name,
-                                       new_stream->relayd_stream_id);
+                                       new_stream->net_seq_idx);
                        cds_list_add(&new_stream->no_monitor_node,
                                        &channel->stream_no_monitor_list.head);
                        break;
This page took 0.027783 seconds and 5 git commands to generate.