Merged!

Mathieu Desnoyers:
> We should at least output one packet before a stream can be considered
> as readable. So far, for PID buffers, if an application exits at the
> wrong timing before a stop waiting for data pending, empty streams could
> be visible by a babeltrace executed after data pending incorrectly
> returned false.
> 
> Fix it by considering a stream for which the consumerd has written 0
> bytes to the output as having data pending.
> 
> This applies to 2.3-rc and stable-2.2.
> 
> Signed-off-by: Mathieu Desnoyers <[email protected]>
> ---
> diff --git a/src/common/consumer.c b/src/common/consumer.c
> index 59207da..e64e2e2 100644
> --- a/src/common/consumer.c
> +++ b/src/common/consumer.c
> @@ -498,6 +498,7 @@ struct lttng_consumer_stream 
> *consumer_allocate_stream(uint64_t channel_key,
>       stream->key = stream_key;
>       stream->out_fd = -1;
>       stream->out_fd_offset = 0;
> +     stream->output_written = 0;
>       stream->state = state;
>       stream->uid = uid;
>       stream->gid = gid;
> @@ -1475,6 +1476,7 @@ ssize_t lttng_consumer_on_read_subbuffer_mmap(
>                                       SYNC_FILE_RANGE_WRITE);
>                       stream->out_fd_offset += ret;
>               }
> +             stream->output_written += ret;
>               written += ret;
>       }
>       lttng_consumer_sync_trace_file(stream, orig_offset);
> @@ -1688,6 +1690,7 @@ ssize_t lttng_consumer_on_read_subbuffer_splice(
>                                       SYNC_FILE_RANGE_WRITE);
>                       stream->out_fd_offset += ret_splice;
>               }
> +             stream->output_written += ret_splice;
>               written += ret_splice;
>       }
>       lttng_consumer_sync_trace_file(stream, orig_offset);
> @@ -3400,6 +3403,16 @@ int consumer_data_pending(uint64_t id)
>                */
>               ret = cds_lfht_is_node_deleted(&stream->node.node);
>               if (!ret) {
> +                     /*
> +                      * An empty output file is not valid. We need at
> +                      * least one packet generated per stream, even
> +                      * if it contains no event, so it contains at
> +                      * least one packet header.
> +                      */
> +                     if (stream->output_written == 0) {
> +                             pthread_mutex_unlock(&stream->lock);
> +                             goto data_pending;
> +                     }
>                       /* Check the stream if there is data in the buffers. */
>                       ret = data_pending(stream);
>                       if (ret == 1) {
> diff --git a/src/common/consumer.h b/src/common/consumer.h
> index 2003cbe..91f6b5c 100644
> --- a/src/common/consumer.h
> +++ b/src/common/consumer.h
> @@ -221,6 +221,8 @@ struct lttng_consumer_stream {
>       int out_fd; /* output file to write the data */
>       /* Write position in the output file descriptor */
>       off_t out_fd_offset;
> +     /* Amount of bytes written to the output */
> +     uint64_t output_written;
>       enum lttng_consumer_stream_state state;
>       int shm_fd_is_copy;
>       int data_read;
> 

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to