[lttng-dev] [PATCH lttng-tools] Fix: update next_net_seq_num after sending header

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Jan 10 12:38:30 EST 2013


* David Goulet (dgoulet at efficios.com) wrote:
> Increment the sequence number after we are sure that the relayd has
> received correctly the data header. If an error occurs when sending the
> header, the data won't be extracted from the buffers thus keeping this
> sequence number untouched.
> 
> Furthermore, after sending the header, if the relayd dies, this value
> won't matter much and if there is an error on the stream when reading
> the trace data, the stream will be deleted thus closed on the relayd
> making this value useless.
> 
> It's important to note that this sequence number is updated on the
> relayd side if the full expected data packet was received. So,
> incrementing the value after the transmission of the header is not
> changing anything in terms of value coherency. The point is to have a
> semantic of when read and used successfully (transmission to relayd),
> let's update it.
> 
> In that code flow, the stream's lock is acquired so no need to
> read/update it atomically. I've also added a comments to better
> understand the purpose of this variable and how to use it.
> 
> Signed-off-by: David Goulet <dgoulet at efficios.com>

Acked-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>

> ---
>  src/common/consumer.c |    4 +++-
>  src/common/consumer.h |   14 +++++++++++++-
>  2 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/src/common/consumer.c b/src/common/consumer.c
> index 935a03d..15fc9b0 100644
> --- a/src/common/consumer.c
> +++ b/src/common/consumer.c
> @@ -755,7 +755,7 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream,
>  		 * this next value, 1 should always be substracted in order to compare
>  		 * the last seen sequence number on the relayd side to the last sent.
>  		 */
> -		data_hdr.net_seq_num = htobe64(stream->next_net_seq_num++);
> +		data_hdr.net_seq_num = htobe64(stream->next_net_seq_num);
>  		/* Other fields are zeroed previously */
>  
>  		ret = relayd_send_data_hdr(&relayd->data_sock, &data_hdr,
> @@ -764,6 +764,8 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream,
>  			goto error;
>  		}
>  
> +		++stream->next_net_seq_num;
> +
>  		/* Set to go on data socket */
>  		outfd = relayd->data_sock.fd;
>  	}
> diff --git a/src/common/consumer.h b/src/common/consumer.h
> index 193533e..8305146 100644
> --- a/src/common/consumer.h
> +++ b/src/common/consumer.h
> @@ -129,7 +129,19 @@ struct lttng_consumer_stream {
>  	unsigned int metadata_flag;
>  	/* Used when the stream is set for network streaming */
>  	uint64_t relayd_stream_id;
> -	/* Next sequence number to use for trace packet */
> +	/*
> +	 * When sending a stream packet to a relayd, this number is used to track
> +	 * the packet sent by the consumer and seen by the relayd. When sending the
> +	 * data header to the relayd, this number is sent and if the transmission
> +	 * was successful, it is incremented.
> +	 *
> +	 * Even if the full data is not fully transmitted it won't matter since
> +	 * only two possible error can happen after that where either the relayd
> +	 * died or a read error is detected on the stream making this value useless
> +	 * after that.
> +	 *
> +	 * This value SHOULD be read/updated atomically or with the lock acquired.
> +	 */
>  	uint64_t next_net_seq_num;
>  	/*
>  	 * Lock to use the stream FDs since they are used between threads.
> -- 
> 1.7.10.4
> 
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list