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.galarn...@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.galarn...@efficios.com>
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-jul...@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
> 
_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to