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