Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladimir Davydov <vdavydov.dev@gmail.com>
To: Konstantin Osipov <kostja@tarantool.org>
Cc: tarantool-patches@freelists.org
Subject: Re: [PATCH 2/5] txn: run on_rollback triggers on txn_abort
Date: Mon, 8 Jul 2019 12:57:46 +0300	[thread overview]
Message-ID: <20190708095746.uay7r44jxhhk5xeh@esperanza> (raw)
In-Reply-To: <20190708093201.GC8512@atlas>

On Mon, Jul 08, 2019 at 12:32:01PM +0300, Konstantin Osipov wrote:
> * Vladimir Davydov <vdavydov.dev@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().

But this function is also called from completion callback, where it has
to set the txn as well. That's why I put it there, otherwise we would
have to set/restore txn context in txn_complete as well. I'm not really
against it - just pointint it out. I'll prepare a patch that does that,
see how it looks.

> >  	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.

But we do want the transaction to remain attached to the fiber once
it resumes its execution so that we can raise an error on 'commit'.
Actually, we used to clear txn on yield, but then it was reworked
to make 'commit' more user-friendly.

  reply	other threads:[~2019-07-08  9:57 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-05 20:25 [PATCH 0/5] Transactional DDL Vladimir Davydov
2019-07-05 20:25 ` [PATCH 1/5] vinyl: don't sync WAL on space alter if not necessary Vladimir Davydov
2019-07-08  9:29   ` Konstantin Osipov
2019-07-08  9:50     ` Vladimir Davydov
2019-07-08 15:01   ` Vladimir Davydov
2019-07-05 20:25 ` [PATCH 2/5] txn: run on_rollback triggers on txn_abort Vladimir Davydov
2019-07-08  9:32   ` Konstantin Osipov
2019-07-08  9:57     ` Vladimir Davydov [this message]
2019-07-08 12:14       ` Konstantin Osipov
2019-07-08 16:37         ` Vladimir Davydov
2019-07-08 21:56           ` Konstantin Osipov
2019-07-09  8:49             ` Vladimir Davydov
2019-07-05 20:25 ` [PATCH 3/5] txn: fix execution order of commit triggers Vladimir Davydov
2019-07-08 12:17   ` Konstantin Osipov
2019-07-08 15:01   ` Vladimir Davydov
2019-07-05 20:25 ` [PATCH 4/5] memtx: fix txn_on_yield for DDL transactions Vladimir Davydov
2019-07-08 12:22   ` Konstantin Osipov
2019-07-08 16:41     ` Vladimir Davydov
2019-07-08 16:58       ` Vladimir Davydov
2019-07-09 10:12         ` Vladimir Davydov
2019-07-08 21:57       ` Konstantin Osipov
2019-07-09  7:51         ` Vladimir Davydov
2019-07-05 20:25 ` [PATCH 5/5] Allow to execute non-yielding DDL statements in transactions Vladimir Davydov
2019-07-05 22:56   ` Konstantin Osipov
2019-07-08  8:09     ` Vladimir Davydov
2019-07-08  8:21       ` Konstantin Osipov
2019-07-08  8:43         ` Vladimir Davydov
2019-07-08  9:25           ` Konstantin Osipov
2019-07-08 16:46             ` Vladimir Davydov
2019-07-08 21:59               ` Konstantin Osipov
2019-07-08 12:26   ` Konstantin Osipov
2019-07-08 16:51     ` Vladimir Davydov
2019-07-08 22:02       ` Konstantin Osipov
2019-07-09  8:11         ` Vladimir Davydov
2019-07-09 11:03           ` Vladimir Davydov
2019-07-08 12:31   ` Konstantin Osipov
2019-07-08 17:00     ` Vladimir Davydov

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=20190708095746.uay7r44jxhhk5xeh@esperanza \
    --to=vdavydov.dev@gmail.com \
    --cc=kostja@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='Re: [PATCH 2/5] txn: run on_rollback triggers on txn_abort' \
    /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