Ust-consumer: Add channel key to error msg on channel clear
[lttng-tools.git] / src / common / ust-consumer / ust-consumer.c
index a81a497a9f8a8fa042ba28f29bbf0e86e73dc92e..0b0b8af56de69c029f8ba419a1d0e190d09004e6 100644 (file)
@@ -765,7 +765,7 @@ static int flush_channel(uint64_t chan_key)
 
                pthread_mutex_lock(&stream->lock);
                if (!stream->quiescent) {
-                       ustctl_flush_buffer(stream->ustream, 0);
+                       lttng_ustconsumer_flush_buffer(stream, 0);
                        stream->quiescent = true;
                }
                pthread_mutex_unlock(&stream->lock);
@@ -987,15 +987,17 @@ end:
 
 /*
  * Snapshot the whole metadata.
+ * RCU read-side lock must be held across this function to ensure existence of
+ * metadata_channel.
  *
  * Returns 0 on success, < 0 on error
  */
-static int snapshot_metadata(uint64_t key, char *path, uint64_t relayd_id,
+static int snapshot_metadata(struct lttng_consumer_channel *metadata_channel,
+               uint64_t key, char *path, uint64_t relayd_id,
                struct lttng_consumer_local_data *ctx,
                uint64_t trace_archive_id)
 {
        int ret = 0;
-       struct lttng_consumer_channel *metadata_channel;
        struct lttng_consumer_stream *metadata_stream;
 
        assert(path);
@@ -1006,13 +1008,6 @@ static int snapshot_metadata(uint64_t key, char *path, uint64_t relayd_id,
 
        rcu_read_lock();
 
-       metadata_channel = consumer_find_channel(key);
-       if (!metadata_channel) {
-               ERR("UST snapshot metadata channel not found for key %" PRIu64,
-                       key);
-               ret = -1;
-               goto error;
-       }
        assert(!metadata_channel->monitor);
 
        health_code_update();
@@ -1083,17 +1078,19 @@ error:
 
 /*
  * Take a snapshot of all the stream of a channel.
+ * RCU read-side lock must be held across this function to ensure existence of
+ * channel.
  *
  * Returns 0 on success, < 0 on error
  */
-static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
+static int snapshot_channel(struct lttng_consumer_channel *channel,
+               uint64_t key, char *path, uint64_t relayd_id,
                uint64_t nb_packets_per_stream,
                struct lttng_consumer_local_data *ctx)
 {
        int ret;
        unsigned use_relayd = 0;
        unsigned long consumed_pos, produced_pos;
-       struct lttng_consumer_channel *channel;
        struct lttng_consumer_stream *stream;
 
        assert(path);
@@ -1105,12 +1102,6 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
                use_relayd = 1;
        }
 
-       channel = consumer_find_channel(key);
-       if (!channel) {
-               ERR("UST snapshot channel not found for key %" PRIu64, key);
-               ret = -1;
-               goto error;
-       }
        assert(!channel->monitor);
        DBG("UST consumer snapshot channel %" PRIu64, key);
 
@@ -1146,7 +1137,7 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
                 * Else, if quiescent, it has already been done by the prior stop.
                 */
                if (!stream->quiescent) {
-                       ustctl_flush_buffer(stream->ustream, 0);
+                       lttng_ustconsumer_flush_buffer(stream, 0);
                }
 
                ret = lttng_ustconsumer_take_snapshot(stream);
@@ -1247,7 +1238,6 @@ error_close_stream:
        consumer_stream_close(stream);
 error_unlock:
        pthread_mutex_unlock(&stream->lock);
-error:
        rcu_read_unlock();
        return ret;
 }
@@ -1751,28 +1741,36 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
        }
        case LTTNG_CONSUMER_SNAPSHOT_CHANNEL:
        {
-               if (msg.u.snapshot_channel.metadata) {
-                       ret = snapshot_metadata(msg.u.snapshot_channel.key,
-                                       msg.u.snapshot_channel.pathname,
-                                       msg.u.snapshot_channel.relayd_id,
-                                       ctx,
-                                       msg.u.snapshot_channel.trace_archive_id);
-                       if (ret < 0) {
-                               ERR("Snapshot metadata failed");
-                               ret_code = LTTCOMM_CONSUMERD_ERROR_METADATA;
-                       }
+               struct lttng_consumer_channel *channel;
+               uint64_t key = msg.u.snapshot_channel.key;
+
+               channel = consumer_find_channel(key);
+               if (!channel) {
+                       DBG("UST snapshot channel not found for key %" PRIu64, key);
+                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
                } else {
-                       ret = snapshot_channel(msg.u.snapshot_channel.key,
-                                       msg.u.snapshot_channel.pathname,
-                                       msg.u.snapshot_channel.relayd_id,
-                                       msg.u.snapshot_channel.nb_packets_per_stream,
-                                       ctx);
-                       if (ret < 0) {
-                               ERR("Snapshot channel failed");
-                               ret_code = LTTCOMM_CONSUMERD_CHANNEL_FAIL;
+                       if (msg.u.snapshot_channel.metadata) {
+                               ret = snapshot_metadata(channel, key,
+                                               msg.u.snapshot_channel.pathname,
+                                               msg.u.snapshot_channel.relayd_id,
+                                               ctx,
+                                               msg.u.snapshot_channel.trace_archive_id);
+                               if (ret < 0) {
+                                       ERR("Snapshot metadata failed");
+                                       ret_code = LTTCOMM_CONSUMERD_SNAPSHOT_FAILED;
+                               }
+                       } else {
+                               ret = snapshot_channel(channel, key,
+                                               msg.u.snapshot_channel.pathname,
+                                               msg.u.snapshot_channel.relayd_id,
+                                               msg.u.snapshot_channel.nb_packets_per_stream,
+                                               ctx);
+                               if (ret < 0) {
+                                       ERR("Snapshot channel failed");
+                                       ret_code = LTTCOMM_CONSUMERD_SNAPSHOT_FAILED;
+                               }
                        }
                }
-
                health_code_update();
                ret = consumer_send_status_msg(sock, ret_code);
                if (ret < 0) {
@@ -1931,22 +1929,31 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
        }
        case LTTNG_CONSUMER_ROTATE_CHANNEL:
        {
-               /*
-                * Sample the rotate position of all the streams in this channel.
-                */
-               ret = lttng_consumer_rotate_channel(msg.u.rotate_channel.key,
-                               msg.u.rotate_channel.pathname,
-                               msg.u.rotate_channel.relayd_id,
-                               msg.u.rotate_channel.metadata,
-                               msg.u.rotate_channel.new_chunk_id,
-                               ctx);
-               if (ret < 0) {
-                       ERR("Rotate channel failed");
-                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
-               }
+               struct lttng_consumer_channel *channel;
+               uint64_t key = msg.u.rotate_channel.key;
 
-               health_code_update();
+               channel = consumer_find_channel(key);
+               if (!channel) {
+                       DBG("Channel %" PRIu64 " not found", key);
+                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
+               } else {
+                       /*
+                        * Sample the rotate position of all the streams in
+                        * this channel.
+                        */
+                       ret = lttng_consumer_rotate_sample_channel(channel, key,
+                                       msg.u.rotate_channel.pathname,
+                                       msg.u.rotate_channel.relayd_id,
+                                       msg.u.rotate_channel.metadata,
+                                       msg.u.rotate_channel.new_chunk_id,
+                                       ctx);
+                       if (ret < 0) {
+                               ERR("Rotate channel failed");
+                               ret_code = LTTCOMM_CONSUMERD_ROTATION_FAIL;
+                       }
 
+                       health_code_update();
+               }
                ret = consumer_send_status_msg(sock, ret_code);
                if (ret < 0) {
                        /* Somehow, the session daemon is not responding anymore. */
@@ -1960,10 +1967,12 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                 * handle this, but it needs to be after the
                 * consumer_send_status_msg() call.
                 */
-               ret = lttng_consumer_rotate_ready_streams(
-                               msg.u.rotate_channel.key, ctx);
-               if (ret < 0) {
-                       ERR("Rotate channel failed");
+               if (channel) {
+                       ret = lttng_consumer_rotate_ready_streams(
+                                       channel, key, ctx);
+                       if (ret < 0) {
+                               ERR("Rotate channel failed");
+                       }
                }
                break;
        }
@@ -1978,7 +1987,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.rotate_rename.relayd_id);
                if (ret < 0) {
                        ERR("Rotate rename failed");
-                       ret_code = LTTCOMM_CONSUMERD_RELAYD_FAIL;
+                       ret_code = LTTCOMM_CONSUMERD_ROTATE_RENAME_FAILED;
                }
 
                health_code_update();
@@ -2002,7 +2011,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.check_rotation_pending_local.chunk_id);
                if (pending < 0) {
                        ERR("Local rotation pending check failed with code %i", pending);
-                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
+                       ret_code = LTTCOMM_CONSUMERD_ROTATION_PENDING_LOCAL_FAILED;
                } else {
                        pending_reply = !!pending;
                }
@@ -2017,7 +2026,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                if (pending < 0) {
                        /*
-                        * An error occured while running the command;
+                        * An error occurred while running the command;
                         * don't send the 'pending' flag as the sessiond
                         * will not read it.
                         */
@@ -2046,7 +2055,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.check_rotation_pending_relay.chunk_id);
                if (pending < 0) {
                        ERR("Relayd rotation pending check failed with code %i", pending);
-                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
+                       ret_code = LTTCOMM_CONSUMERD_ROTATION_PENDING_RELAY_FAILED;
                } else {
                        pending_reply = !!pending;
                }
@@ -2061,7 +2070,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                if (pending < 0) {
                        /*
-                        * An error occured while running the command;
+                        * An error occurred while running the command;
                         * don't send the 'pending' flag as the sessiond
                         * will not read it.
                         */
@@ -2088,7 +2097,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.mkdir.relayd_id);
                if (ret < 0) {
                        ERR("consumer mkdir failed");
-                       ret_code = LTTCOMM_CONSUMERD_RELAYD_FAIL;
+                       ret_code = LTTCOMM_CONSUMERD_MKDIR_FAILED;
                }
 
                health_code_update();
@@ -2100,6 +2109,31 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                }
                break;
        }
+       case LTTNG_CONSUMER_CLEAR_CHANNEL:
+       {
+               struct lttng_consumer_channel *channel;
+               uint64_t key = msg.u.clear_channel.key;
+
+               channel = consumer_find_channel(key);
+               if (!channel) {
+                       DBG("Channel %" PRIu64 " not found", key);
+                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
+               } else {
+                       ret = lttng_consumer_clear_channel(channel);
+                       if (ret) {
+                               ERR("Clear channel failed key %" PRIu64, key);
+                               ret_code = ret;
+                       }
+
+                       health_code_update();
+               }
+               ret = consumer_send_status_msg(sock, ret_code);
+               if (ret < 0) {
+                       /* Somehow, the session daemon is not responding anymore. */
+                       goto end_nosignal;
+               }
+               break;
+       }
        default:
                break;
        }
@@ -2180,15 +2214,6 @@ void *lttng_ustctl_get_mmap_base(struct lttng_consumer_stream *stream)
        return ustctl_get_mmap_base(stream->ustream);
 }
 
-void lttng_ustctl_flush_buffer(struct lttng_consumer_stream *stream,
-               int producer_active)
-{
-       assert(stream);
-       assert(stream->ustream);
-
-       ustctl_flush_buffer(stream->ustream, producer_active);
-}
-
 /*
  * Take a snapshot for a specific stream.
  *
@@ -2255,6 +2280,14 @@ void lttng_ustconsumer_flush_buffer(struct lttng_consumer_stream *stream,
        ustctl_flush_buffer(stream->ustream, producer);
 }
 
+void lttng_ustconsumer_clear_buffer(struct lttng_consumer_stream *stream)
+{
+       assert(stream);
+       assert(stream->ustream);
+
+       ustctl_clear_buffer(stream->ustream);
+}
+
 int lttng_ustconsumer_get_current_timestamp(
                struct lttng_consumer_stream *stream, uint64_t *ts)
 {
@@ -2285,7 +2318,7 @@ void lttng_ustconsumer_on_stream_hangup(struct lttng_consumer_stream *stream)
 
        pthread_mutex_lock(&stream->lock);
        if (!stream->quiescent) {
-               ustctl_flush_buffer(stream->ustream, 0);
+               lttng_ustconsumer_flush_buffer(stream, 0);
                stream->quiescent = true;
        }
        pthread_mutex_unlock(&stream->lock);
@@ -2551,7 +2584,7 @@ int lttng_ustconsumer_sync_metadata(struct lttng_consumer_local_data *ctx,
                retry = 1;
        }
 
-       ustctl_flush_buffer(metadata->ustream, 1);
+       lttng_ustconsumer_flush_buffer(metadata, 1);
        ret = ustctl_snapshot(metadata->ustream);
        if (ret < 0) {
                if (errno != EAGAIN) {
@@ -2755,7 +2788,7 @@ retry:
                        if (ret <= 0) {
                                goto error;
                        }
-                       ustctl_flush_buffer(stream->ustream, 1);
+                       lttng_ustconsumer_flush_buffer(stream, 1);
                        goto retry;
                }
 
This page took 0.032298 seconds and 5 git commands to generate.