From: Serge Petrenko <sergepetrenko@tarantool.org> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>, sergos@tarantool.org, gorcunov@tarantool.org, lvasiliev@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH 1/2] box: rework local_recovery to use async txn_commit Date: Mon, 22 Jun 2020 21:55:31 +0300 [thread overview] Message-ID: <c56a7c97-dd93-adff-5fbd-37b0d05ed7aa@tarantool.org> (raw) In-Reply-To: <bc71772b-76b7-88c1-0096-9b96d08483ea@tarantool.org> 22.06.2020 14:19, Serge Petrenko пишет: > > 21.06.2020 19:25, Vladislav Shpilevoy пишет: >> Hi! Thanks for the patch! >> >>> diff --git a/src/box/box.cc b/src/box/box.cc >>> index f80d6f8e6..0fe7625fb 100644 >>> --- a/src/box/box.cc >>> +++ b/src/box/box.cc >>> @@ -222,6 +222,12 @@ box_process_rw(struct request *request, struct >>> space *space, >>> */ >>> if (is_local_recovery) { >>> res = txn_commit_async(txn); >>> + /* >>> + * Hack: remove the unnecessary trigger. >>> + * I don't know of a better place to do >>> + * it. >>> + */ >> Why is it necessary to remove it? > > The trigger is set after journal_write_async() returns. > The idea is that journal_write_async() just submits the request for > writing, and later, journal_async_complete(), which is > txn_complete_async() > completes the tx processing. The key word here is "later", meaning that > txn_complete_async() is called after txn_commit async() returns. > > This is why txn_complete_async() clears the trigger set on write failure: > if write fails, we rollback the tx and remove the entry from the limbo. > If writing doesn't fail, it's limbo's business to remove an entry. The > tx still > may be rolled back due to a timeout, then limbo will remove the entry, > and if > an on_rollback trigger isn't cleared, it'll try to remove the entry > again. > > Now, back to this case: I reworked recovery_journal to use write_async(). > recovery_journal_write_async() calls journal_async_complete() right away, > since there're no actual writes and no one else can call > journal_async_complete(). > > So, once journal_write_async() returns, the trigger is cleared, but > later it's > reset at the end of txn_commit_async(), because txn_commit_async() > assumes that > the write hasn't happened yet, and journal_async_complete() is yet to > be called. > > One option is to call journal_async_complete() after > txn_commit_async(), this will > solve the problem, but journal_async_complete() receives `struct > journal_entry *`, > and we have no knowledge of the journal entry outside of > `txn_commit_async()`. > > Another option is to set a txn_flag, like > "TXN_DONT_EXPECT_WRITE_FAILURE", so that > the txn doesn't set an on_write_failure trigger when we don't need it. > But this > also looks ugly. > > That's why I unconditionally reset the trigger after txn_commit_async(). After further discussion, we decided to use different values of txn->signature < 0 as reasons for rollbackand instead of resetting the on_write_failure triggers, we'll just make them work onlyfor some rollback reasons (like failed write). > >> >>> + trigger_clear(&txn->on_write_failure); >>> } else { >>> res = txn_commit(txn); >>> } > -- Serge Petrenko
next prev parent reply other threads:[~2020-06-22 18:55 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-06-19 18:00 [Tarantool-patches] [PATCH 0/2] replication: support CONFIRM and ROLLBACK in recovery Serge Petrenko 2020-06-19 18:00 ` [Tarantool-patches] [PATCH 1/2] box: rework local_recovery to use async txn_commit Serge Petrenko 2020-06-19 18:45 ` Serge Petrenko 2020-06-21 16:25 ` Vladislav Shpilevoy 2020-06-22 11:19 ` Serge Petrenko 2020-06-22 18:55 ` Serge Petrenko [this message] 2020-06-22 21:43 ` Vladislav Shpilevoy 2020-06-23 8:39 ` Serge Petrenko 2020-06-26 22:00 ` Vladislav Shpilevoy 2020-06-19 18:00 ` [Tarantool-patches] [PATCH 2/2] replication: support ROLLBACK and CONFIRM during recovery Serge Petrenko 2020-06-23 11:50 ` Serge Petrenko
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=c56a7c97-dd93-adff-5fbd-37b0d05ed7aa@tarantool.org \ --to=sergepetrenko@tarantool.org \ --cc=gorcunov@tarantool.org \ --cc=lvasiliev@tarantool.org \ --cc=sergos@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 1/2] box: rework local_recovery to use async txn_commit' \ /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