[PATCH 2/5] txn: run on_rollback triggers on txn_abort

Konstantin Osipov kostja at tarantool.org
Mon Jul 8 12:32:01 MSK 2019


* Vladimir Davydov <vdavydov.dev at gmail.com> [19/07/05 23:27]:
> When a memtx transaction is aborted on yield, it isn't enough to
> rollback individual statements - we must also run on_rollback triggers,
> otherwise changes done to the schema by an aborted DDL transaction will
> be visible to other fibers until an attempt to commit it is made.
> ---
>  src/box/txn.c                 |  7 ++++++-
>  test/box/transaction.result   | 24 ++++++++++++++++++++++++
>  test/box/transaction.test.lua | 10 ++++++++++
>  3 files changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/src/box/txn.c b/src/box/txn.c
> index 818f405b..5d80833a 100644
> --- a/src/box/txn.c
> +++ b/src/box/txn.c
> @@ -346,6 +346,7 @@ txn_run_triggers(struct txn *txn, struct rlist *trigger)
>  	 * Some triggers require for in_txn variable to be set so
>  	 * restore it for the time triggers are in progress.
>  	 */
> +	struct txn *old_txn = in_txn();

This manipulation should be in txn_abort(), not in
txn_run_triggers(). It's txn_abort().
>  	fiber_set_txn(fiber(), txn);
>  	/* Rollback triggers must not throw. */
>  	if (trigger_run(trigger, txn) != 0) {
> @@ -357,7 +358,7 @@ txn_run_triggers(struct txn *txn, struct rlist *trigger)
>  		unreachable();
>  		panic("commit/rollback trigger failed");
>  	}
> -	fiber_set_txn(fiber(), NULL);
> +	fiber_set_txn(fiber(), old_txn);

Ideally we should never need to restore old_txn. All transaction
statements, like txn_begin() or txn_abort() should set the txn, 
and whenever the transaction yields, the txn should be cleared.


-- 
Konstantin Osipov, Moscow, Russia



More information about the Tarantool-patches mailing list