From: Serge Petrenko <sergepetrenko@tarantool.org> To: v.shpilevoy@tarantool.org, sergos@tarantool.org, gorcunov@gmail.com, Leonid Vasiliev <lvasiliev@tarantool.org> Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH 8/8] replication: write and read CONFIRM entries Date: Tue, 23 Jun 2020 11:35:55 +0300 [thread overview] Message-ID: <dccbfcd1-03a0-9619-6495-49d6dcdacc1a@tarantool.org> (raw) In-Reply-To: <2b60eacb-abfe-84af-c94a-1a6f68c87614@tarantool.org> 19.06.2020 20:50, Serge Petrenko пишет: > 09.06.2020 15:20, Serge Petrenko пишет: >> Make txn_limbo write a CONFIRM entry as soon as a batch of entries >> receive their acks. CONFIRM entry is written to WAL and later replicated >> to all the replicas. >> >> Now replicas put synchronous transactions into txn_limbo and wait for >> corresponding confirmation entries to arrive and end up in their WAL >> before committing the transactions. >> > Added a new commit: > > commit 88884031e6ea8ca836228432b400ca1557afafa6 > Author: Serge Petrenko <sergepetrenko@tarantool.org> > Date: Fri Jun 19 18:21:11 2020 +0300 > > txn: rework synchronous tx on_rollback trigger > > Instead of allocating the trigger on heap, which would lead to use > after > free, allocate the trigger together with the txn. > Also, clear the trigger when asynchronous journal write succeeds. > > [TO BE SQUASHED INTO THE PREVIOUS COMMIT] > > diff --git a/src/box/txn.c b/src/box/txn.c > index 4f787db79..16856da0d 100644 > --- a/src/box/txn.c > +++ b/src/box/txn.c > @@ -238,6 +238,7 @@ txn_begin(void) > /* fiber_on_yield is initialized by engine on demand */ > trigger_create(&txn->fiber_on_stop, txn_on_stop, NULL, NULL); > trigger_add(&fiber()->on_stop, &txn->fiber_on_stop); > + trigger_create(&txn->on_write_failure, NULL, NULL, NULL); > /* > * By default all transactions may yield. > * It's a responsibility of an engine to disable yields > @@ -458,6 +459,12 @@ txn_complete(struct txn *txn) > stop_tm - txn->start_tm); > } > } else { > + /* > + * Async write succeeded. Clear the trigger which > + * would remove the corresponding txn_limbo entry > + * in case of failure. > + */ > + trigger_clear(&txn->on_write_failure); > /* > * Complete is called on every WAL operation > * authored by this transaction. And it not always > @@ -681,10 +688,10 @@ txn_commit_async(struct txn *txn) > * Set a trigger to abort waiting for confirm on WAL write > * failure. > */ > + trigger_create(&txn->on_write_failure, txn_limbo_on_rollback, > + limbo_entry, NULL); > if (is_sync) { > - struct trigger trig; > - trigger_create(&trig, txn_limbo_on_rollback, limbo_entry, NULL); > - txn_on_rollback(txn, &trig); > + txn_on_rollback(txn, &txn->on_write_failure); > } > return 0; > } > diff --git a/src/box/txn.h b/src/box/txn.h > index e7705bb48..9efd6fd0d 100644 > --- a/src/box/txn.h > +++ b/src/box/txn.h > @@ -228,6 +228,14 @@ struct txn { > * in case a fiber stops (all engines). > */ > struct trigger fiber_on_stop; > + /** > + * An on_rollback trigger for synchronous transactions > + * removing the txn_limbo entry which would wait for > + * confirmation otherwise. > + * Is issued on asynchronous write failure and is cleared > + * on write success. > + */ > + struct trigger on_write_failure; > /** Commit and rollback triggers. */ > struct rlist on_commit, on_rollback; > /** > Changed this commit: commit d3bd829759dd3cf3d49170da701d410af111cb60 Author: Serge Petrenko <sergepetrenko@tarantool.org> Date: Fri Jun 19 18:21:11 2020 +0300 txn: rework synchronous tx on_rollback trigger Instead of allocating the trigger on heap, which would lead to use after free, allocate the trigger on the txn region. [TO BE SQUASHED INTO THE PREVIOUS COMMIT] diff --git a/src/box/txn.c b/src/box/txn.c index bf17fd749..d960c3888 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -670,6 +670,22 @@ txn_commit_async(struct txn *txn) txn_limbo_assign_lsn(&txn_limbo, limbo_entry, lsn); } + /* + * We'll need this trigger for sync transactions later, + * but allocation failure is inappropriate after the entry + * is sent to journal, so allocate early. + */ + struct trigger *trig; + if (is_sync) { + size_t size; + trig = region_alloc_object(&txn->region, typeof(*trig), &size); + if (trig == NULL) { + diag_set(OutOfMemory, size, "region_alloc_object", + "trig"); + return -1; + } + } + fiber_set_txn(fiber(), NULL); if (journal_write_async(req) != 0) { fiber_set_txn(fiber(), txn); @@ -682,14 +698,14 @@ txn_commit_async(struct txn *txn) return -1; } - /* - * Set a trigger to abort waiting for confirm on WAL write - * failure. - */ if (is_sync) { - struct trigger trig; - trigger_create(&trig, txn_limbo_on_rollback, limbo_entry, NULL); - txn_on_rollback(txn, &trig); + /* + * Set a trigger to abort waiting for confirm on + * WAL write failure. + */ + trigger_create(trig, txn_limbo_on_rollback, + limbo_entry, NULL); + txn_on_rollback(txn, trig); } return 0; -- Serge Petrenko
next prev parent reply other threads:[~2020-06-23 8:35 UTC|newest] Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-06-09 12:20 [Tarantool-patches] [PATCH 0/8] wait for lsn and confirm Serge Petrenko 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 1/8] replication: introduce space.is_sync option Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-18 22:27 ` Leonid Vasiliev 2020-06-21 16:24 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 2/8] replication: introduce replication_sync_quorum cfg Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-15 23:05 ` Vladislav Shpilevoy 2020-06-18 22:54 ` Leonid Vasiliev 2020-06-19 17:45 ` Serge Petrenko 2020-06-21 16:25 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 3/8] txn: add TXN_WAIT_ACK flag Serge Petrenko 2020-06-18 23:12 ` Leonid Vasiliev 2020-06-21 16:25 ` Vladislav Shpilevoy 2020-06-22 9:44 ` Serge Petrenko 2020-06-23 22:13 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 4/8] replication: make sync transactions wait quorum Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-11 14:57 ` Vladislav Shpilevoy 2020-06-15 23:05 ` Vladislav Shpilevoy 2020-06-19 12:39 ` Leonid Vasiliev 2020-06-25 21:48 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 5/8] txn_limbo: follow-up fixes Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-11 8:46 ` Serge Petrenko 2020-06-11 13:01 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 6/8] txn_limbo: fix instance id assignment Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 7/8] xrow: introduce CONFIRM entry Serge Petrenko 2020-06-19 15:18 ` Leonid Vasiliev 2020-06-22 10:14 ` Serge Petrenko 2020-06-23 8:33 ` Serge Petrenko 2020-06-09 12:20 ` [Tarantool-patches] [PATCH 8/8] replication: write and read CONFIRM entries Serge Petrenko 2020-06-10 23:51 ` Vladislav Shpilevoy 2020-06-11 8:56 ` Serge Petrenko 2020-06-11 13:04 ` Vladislav Shpilevoy 2020-06-11 14:57 ` Vladislav Shpilevoy 2020-06-15 23:05 ` Vladislav Shpilevoy 2020-06-18 11:32 ` Leonid Vasiliev 2020-06-18 21:49 ` Vladislav Shpilevoy 2020-06-19 17:48 ` Serge Petrenko 2020-06-19 17:50 ` Serge Petrenko 2020-06-23 8:35 ` Serge Petrenko [this message] 2020-06-20 15:06 ` Leonid Vasiliev 2020-06-22 10:34 ` Serge Petrenko 2020-06-23 8:34 ` Serge Petrenko 2020-06-25 22:04 ` Vladislav Shpilevoy 2020-06-25 22:31 ` Vladislav Shpilevoy 2020-06-26 10:58 ` Serge Petrenko 2020-06-09 12:53 ` [Tarantool-patches] [PATCH 0/2] A few fixes for building Cyrill Gorcunov 2020-06-09 12:53 ` [Tarantool-patches] [PATCH 1/2] box/applier: fix typo Cyrill Gorcunov 2020-06-10 9:18 ` Sergey Ostanevich 2020-06-09 12:53 ` [Tarantool-patches] [PATCH 2/2] box: use tnt_raise for quorum check Cyrill Gorcunov 2020-06-10 9:17 ` Sergey Ostanevich 2020-06-10 10:45 ` Serge Petrenko 2020-06-22 21:51 ` [Tarantool-patches] [PATCH 0/8] wait for lsn and confirm Vladislav Shpilevoy
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=dccbfcd1-03a0-9619-6495-49d6dcdacc1a@tarantool.org \ --to=sergepetrenko@tarantool.org \ --cc=gorcunov@gmail.com \ --cc=lvasiliev@tarantool.org \ --cc=sergos@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 8/8] replication: write and read CONFIRM entries' \ /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