Tarantool development patches archive
 help / color / mirror / Atom feed
From: Serge Petrenko <sergepetrenko@tarantool.org>
To: Cyrill Gorcunov <gorcunov@gmail.com>
Cc: tarantool-patches@dev.tarantool.org, v.shpilevoy@tarantool.org
Subject: Re: [Tarantool-patches] [PATCH 1/2] wal: fix tx boundaries
Date: Tue, 19 May 2020 13:30:10 +0300	[thread overview]
Message-ID: <6b83f635-bd42-9a49-bfbd-69778f749d12@tarantool.org> (raw)
In-Reply-To: <20200519090815.GB121099@grain>


19.05.2020 12:08, Cyrill Gorcunov пишет:
> On Mon, May 18, 2020 at 03:24:04PM +0300, Serge Petrenko wrote:
> ...
>> --- a/src/box/wal.c
>> +++ b/src/box/wal.c
>> @@ -956,24 +956,33 @@ wal_assign_lsn(struct vclock *vclock_diff, struct vclock *base,
>>   	       struct xrow_header **end)
>>   {
>>   	int64_t tsn = 0;
>> +	struct xrow_header **start = row;
>> +	struct xrow_header **first_glob_row = end;
>>   	/** Assign LSN to all local rows. */
>>   	for ( ; row < end; row++) {
>>   		if ((*row)->replica_id == 0) {
>>   			/*
>>   			 * All rows representing local space data
>> -			 * manipulations are signed wth a zero
>> +			 * manipulations are signed with a zero
>>   			 * instance id. This is also true for
>>   			 * anonymous replicas, since they are
>>   			 * only capable of writing to local and
>>   			 * temporary spaces.
>>   			 */
>> -			if ((*row)->group_id != GROUP_LOCAL)
>> +			if ((*row)->group_id != GROUP_LOCAL) {
>>   				(*row)->replica_id = instance_id;
>> +			}
>>   
>>   			(*row)->lsn = vclock_inc(vclock_diff, (*row)->replica_id) +
>>   				      vclock_get(base, (*row)->replica_id);
>> -			/* Use lsn of the first local row as transaction id. */
>> -			tsn = tsn == 0 ? (*row)->lsn : tsn;
>> +			/*
>> +			 * Use lsn of the first global row as
>> +			 * transaction id.
>> +			 */
>> +			if ((*row)->group_id != GROUP_LOCAL && tsn == 0) {
>> +				tsn = (*row)->lsn;
>> +				first_glob_row = row;
>> +			}
>>   			(*row)->tsn = tsn;
> 1) ^^^
>
>>   			(*row)->is_commit = row == end - 1;
>>   		} else {
>> @@ -993,6 +1002,15 @@ wal_assign_lsn(struct vclock *vclock_diff, struct vclock *base,
>>   			}
>>   		}
>>   	}
>> +	if (tsn == 0)
>> +		tsn = (*start)->lsn;
>> +	/*
>> +	 * Fill transaction id for all the local rows preceding
>> +	 * the first global row. tsn was yet unknown when those
>> +	 * rows were processed.
>> +	 */
>> +	for (row = start; row < first_glob_row; row++)
>> +		(*row)->tsn = tsn;
>>   }
> Wait, the chunk above -- lets assume we've all rows in GROUP_LOCAL thus
> in (1) we already set this member to 0 and now we re-walk the entries
> again and assign lsn to the first row's lsn. This is ugly as hell,
> if only I didn't miss something obvious.
>
> Can't we do something like below to eliminate needless rewalk over
> all rows? Do I make a mistake?
> ---
> diff --git a/src/box/wal.c b/src/box/wal.c
> index d36d4259e..ef4d84920 100644
> --- a/src/box/wal.c
> +++ b/src/box/wal.c
> @@ -957,7 +957,7 @@ wal_assign_lsn(struct vclock *vclock_diff, struct vclock *base,
>   {
>   	int64_t tsn = 0;
>   	struct xrow_header **start = row;
> -	struct xrow_header **first_glob_row = end;
> +	struct xrow_header **first_glob_row = row;
>   	/** Assign LSN to all local rows. */
>   	for ( ; row < end; row++) {
>   		if ((*row)->replica_id == 0) {
> @@ -981,9 +981,12 @@ wal_assign_lsn(struct vclock *vclock_diff, struct vclock *base,
>   			 */
>   			if ((*row)->group_id != GROUP_LOCAL && tsn == 0) {
>   				tsn = (*row)->lsn;
> +				/*
> +				 * Remember the tail being processed.
> +				 */
>   				first_glob_row = row;
>   			}
> -			(*row)->tsn = tsn;
> +			(*row)->tsn = tsn == 0 ? (*start)->lsn : tsn;
>   			(*row)->is_commit = row == end - 1;
>   		} else {
>   			int64_t diff = (*row)->lsn - vclock_get(base, (*row)->replica_id);
> @@ -1002,8 +1005,7 @@ wal_assign_lsn(struct vclock *vclock_diff, struct vclock *base,
>   			}
>   		}
>   	}
> -	if (tsn == 0)
> -		tsn = (*start)->lsn;
> +
>   	/*
>   	 * Fill transaction id for all the local rows preceding
>   	 * the first global row. tsn was yet unknown when those


Hi! Thanks for the review!

You're right, I applied your diff.

-- 
Serge Petrenko

  reply	other threads:[~2020-05-19 10:30 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-18 12:24 [Tarantool-patches] [PATCH 0/2] fix replication tx boundaries after local space rework Serge Petrenko
2020-05-18 12:24 ` [Tarantool-patches] [PATCH 1/2] wal: fix tx boundaries Serge Petrenko
2020-05-19  9:08   ` Cyrill Gorcunov
2020-05-19 10:30     ` Serge Petrenko [this message]
2020-05-18 12:24 ` [Tarantool-patches] [PATCH 2/2] replication: make relay send txs in batches Serge Petrenko
2020-05-18 12:28   ` Serge Petrenko
2020-05-19 10:23     ` Cyrill Gorcunov
2020-05-19 10:49       ` Serge Petrenko
2020-05-19 11:18         ` Cyrill Gorcunov
2020-05-19 12:31           ` Serge Petrenko
2020-05-19 16:24             ` Serge Petrenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6b83f635-bd42-9a49-bfbd-69778f749d12@tarantool.org \
    --to=sergepetrenko@tarantool.org \
    --cc=gorcunov@gmail.com \
    --cc=tarantool-patches@dev.tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH 1/2] wal: fix tx boundaries' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox