[lttng-dev] [PATCH lttng-tools] Fix: acquire stream lock during kernel metadata snapshot
Jérémie Galarneau
jeremie.galarneau at efficios.com
Wed Sep 19 11:54:01 EDT 2018
Merged in master, stable-2.11, stable-2.10, and stable-2.9.
Thanks,
Jérémie
On Mon, Sep 10, 2018 at 08:09:12PM -0400, Jonathan Rajotte wrote:
> From: Jérémie Galarneau <jeremie.galarneau at efficios.com>
>
> The stream lock is not taken when interacting with the kernel
> metadata stream that is created at the time a snapshot is taken.
>
> This was noticed while reviewing the code for an unrelated reason,
> so there is no known problem caused by this. Nevertheless, this
> is incorrect as the stream is globally visible in the consumer.
>
> Moreover, the stream was not cleaned-up which can cause a leak
> whenever a metadata snapshot fails.
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> ---
> src/common/kernel-consumer/kernel-consumer.c | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c
> index 87ade12fa..3455f827b 100644
> --- a/src/common/kernel-consumer/kernel-consumer.c
> +++ b/src/common/kernel-consumer/kernel-consumer.c
> @@ -336,7 +336,7 @@ end:
> *
> * Returns 0 on success, < 0 on error
> */
> -int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> +static int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> uint64_t relayd_id, struct lttng_consumer_local_data *ctx)
> {
> int ret, use_relayd = 0;
> @@ -355,11 +355,12 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> if (!metadata_channel) {
> ERR("Kernel snapshot metadata not found for key %" PRIu64, key);
> ret = -1;
> - goto error;
> + goto error_no_channel;
> }
>
> metadata_stream = metadata_channel->metadata_stream;
> assert(metadata_stream);
> + pthread_mutex_lock(&metadata_stream->lock);
>
> /* Flag once that we have a valid relayd for the stream. */
> if (relayd_id != (uint64_t) -1ULL) {
> @@ -369,7 +370,7 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> if (use_relayd) {
> ret = consumer_send_relayd_stream(metadata_stream, path);
> if (ret < 0) {
> - goto error;
> + goto error_snapshot;
> }
> } else {
> ret = utils_create_stream_file(path, metadata_stream->name,
> @@ -377,7 +378,7 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> metadata_stream->tracefile_count_current,
> metadata_stream->uid, metadata_stream->gid, NULL);
> if (ret < 0) {
> - goto error;
> + goto error_snapshot;
> }
> metadata_stream->out_fd = ret;
> }
> @@ -390,7 +391,8 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> if (ret_read != -EAGAIN) {
> ERR("Kernel snapshot reading metadata subbuffer (ret: %zd)",
> ret_read);
> - goto error;
> + ret = ret_read;
> + goto error_snapshot;
> }
> /* ret_read is negative at this point so we will exit the loop. */
> continue;
> @@ -415,11 +417,12 @@ int lttng_kconsumer_snapshot_metadata(uint64_t key, char *path,
> }
>
> ret = 0;
> -
> +error_snapshot:
> + pthread_mutex_unlock(&metadata_stream->lock);
> cds_list_del(&metadata_stream->send_node);
> consumer_stream_destroy(metadata_stream, NULL);
> metadata_channel->metadata_stream = NULL;
> -error:
> +error_no_channel:
> rcu_read_unlock();
> return ret;
> }
> --
> 2.17.1
>
More information about the lttng-dev
mailing list