[Tarantool-patches] [PATCH 08/11] qsync: txn_limbo_wait_confirm -- refactor code a bit

Serge Petrenko sergepetrenko at tarantool.org
Fri Nov 13 12:56:37 MSK 2020


12.11.2020 22:51, Cyrill Gorcunov пишет:
>   - no need for useless comments which describe what
>     we're doing, it is obvious from the code, instead
>     put comment explaining "why" we're doing these
>     things;
>   - use designated assignments for cwp, this is a rule
>     of thumb for C where structure need to be initialized
>     from the scratch;
>   - reorder triggers declaration mess, without empty lines
>     which are ordering context they are simply unreadable;
>   - try to not use goto/jumps when possible (gotos are
>     suitable as a common error entry point but here we
>     can handle everything inside cycle itself).
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
> ---

Thanks for the patch!

LGTM

>   src/box/txn_limbo.c | 54 ++++++++++++++++++++++-----------------------
>   1 file changed, 26 insertions(+), 28 deletions(-)
>
> diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c
> index b58b9647d..cf6122360 100644
> --- a/src/box/txn_limbo.c
> +++ b/src/box/txn_limbo.c
> @@ -573,20 +573,25 @@ txn_limbo_wait_confirm(struct txn_limbo *limbo)
>   	if (txn_limbo_is_empty(limbo))
>   		return 0;
>   
> -	/* initialization of a waitpoint. */
> -	struct confirm_waitpoint cwp;
> -	cwp.caller = fiber();
> -	cwp.is_confirm = false;
> -	cwp.is_rollback = false;
> -
> -	/* Set triggers for the last limbo transaction. */
> -	struct trigger on_complete;
> +	struct confirm_waitpoint cwp = {
> +		.caller = fiber(),
> +		.is_confirm = false,
> +		.is_rollback = false,
> +	};
> +
> +	/*
> +	 * Since we're waiting for all sync transactions to complete,
> +	 * we need the last entry from the limbo.
> +	 */
> +	struct txn_limbo_entry *tle = txn_limbo_last_entry(limbo);
> +
> +	struct trigger on_complete, on_rollback;
>   	trigger_create(&on_complete, txn_commit_cb, &cwp, NULL);
> -	struct trigger on_rollback;
>   	trigger_create(&on_rollback, txn_rollback_cb, &cwp, NULL);
> -	struct txn_limbo_entry *tle = txn_limbo_last_entry(limbo);
> +
>   	txn_on_commit(tle->txn, &on_complete);
>   	txn_on_rollback(tle->txn, &on_rollback);
> +
>   	double start_time = fiber_clock();
>   	while (true) {
>   		double deadline = start_time + replication_synchro_timeout;
> @@ -594,25 +599,18 @@ txn_limbo_wait_confirm(struct txn_limbo *limbo)
>   		double timeout = deadline - fiber_clock();
>   		int rc = fiber_cond_wait_timeout(&limbo->wait_cond, timeout);
>   		fiber_set_cancellable(cancellable);
> -		if (cwp.is_confirm || cwp.is_rollback)
> -			goto complete;
> -		if (rc != 0)
> -			goto timed_out;
> -	}
> -timed_out:
> -	/* Clear the triggers if the timeout has been reached. */
> -	trigger_clear(&on_complete);
> -	trigger_clear(&on_rollback);
> -	diag_set(ClientError, ER_SYNC_QUORUM_TIMEOUT);
> -	return -1;
> -
> -complete:
> -	if (!cwp.is_confirm) {
> -		/* The transaction has been rolled back. */
> -		diag_set(ClientError, ER_SYNC_ROLLBACK);
> -		return -1;
> +		if (cwp.is_confirm) {
> +			return 0;
> +		} else if (cwp.is_rollback) {
> +			diag_set(ClientError, ER_SYNC_ROLLBACK);
> +			return -1;
> +		} else if (rc != 0) {
> +			trigger_clear(&on_complete);
> +			trigger_clear(&on_rollback);
> +			diag_set(ClientError, ER_SYNC_QUORUM_TIMEOUT);
> +			return -1;
> +		}
>   	}
> -	return 0;
>   }
>   
>   int

-- 
Serge Petrenko



More information about the Tarantool-patches mailing list