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 14:19:47 +0300 [thread overview] Message-ID: <bc71772b-76b7-88c1-0096-9b96d08483ea@tarantool.org> (raw) In-Reply-To: <ecb9c03f-0977-7395-c7c5-8780e95ec7db@tarantool.org> 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(). > >> + trigger_clear(&txn->on_write_failure); >> } else { >> res = txn_commit(txn); >> } -- Serge Petrenko
next prev parent reply other threads:[~2020-06-22 11:19 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 [this message] 2020-06-22 18:55 ` Serge Petrenko 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=bc71772b-76b7-88c1-0096-9b96d08483ea@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