From: Cyrill Gorcunov <gorcunov@gmail.com> To: tml <tarantool-patches@dev.tarantool.org> Subject: [Tarantool-patches] [PATCH 06/14] box/journal: supersede journal_write with journal_write_async Date: Wed, 19 Feb 2020 21:37:05 +0300 [thread overview] Message-ID: <20200219183713.17646-7-gorcunov@gmail.com> (raw) In-Reply-To: <20200219183713.17646-1-gorcunov@gmail.com> 1) name it journal_write_async, since it operates in async mode where completion handlers are deferred upon journal engine does a real write; 2) require a caller to ship a fiber with active transaction bound so we could restore it back if write operation failed thus rollback will obtain consistent active transaction; 3) move fiber_set_txn to the header file for reuse in journal_write_async. Suggested-by: Konstantin Osipov <kostja.osipov@gmail.com> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> --- src/box/journal.c | 22 ++++++++++++++++++++++ src/box/journal.h | 9 +++------ src/box/txn.c | 9 +-------- src/box/txn.h | 9 +++++++++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/box/journal.c b/src/box/journal.c index 11e78990d..238860165 100644 --- a/src/box/journal.c +++ b/src/box/journal.c @@ -29,6 +29,8 @@ * SUCH DAMAGE. */ #include "journal.h" +#include "fiber.h" +#include "txn.h" #include <small/region.h> #include <diag.h> @@ -76,3 +78,23 @@ journal_entry_new(size_t n_rows, struct region *region, return entry; } +int +journal_write_async(struct journal_entry *entry) +{ + struct txn *txn = in_txn(); + assert(txn != NULL); + + /* + * The transaction should be unbound + * from current fiber, once operation + * is complete the journal engine will + * bound it back. For rollback sake we + * bind it by self on error path. + */ + fiber_set_txn(fiber(), NULL); + int ret = current_journal->write(current_journal, entry); + if (ret != 0) + fiber_set_txn(fiber(), txn); + + return ret; +} diff --git a/src/box/journal.h b/src/box/journal.h index 64f167c6f..efb6ac8e1 100644 --- a/src/box/journal.h +++ b/src/box/journal.h @@ -124,15 +124,12 @@ struct journal { extern struct journal *current_journal; /** - * Send a single entry to write. + * Queue a single entry to write. * * @return 0 if write was scheduled or -1 in case of an error. */ -static inline int -journal_write(struct journal_entry *entry) -{ - return current_journal->write(current_journal, entry); -} +extern int +journal_write_async(struct journal_entry *entry); /** * Change the current implementation of the journaling API. diff --git a/src/box/txn.c b/src/box/txn.c index 682480c16..05321e97d 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -49,12 +49,6 @@ txn_on_yield(struct trigger *trigger, void *event); static void txn_run_rollback_triggers(struct txn *txn, struct rlist *triggers); -static inline void -fiber_set_txn(struct fiber *fiber, struct txn *txn) -{ - fiber->storage.txn = txn; -} - static int txn_add_redo(struct txn *txn, struct txn_stmt *stmt, struct request *request) { @@ -520,7 +514,7 @@ txn_write_to_wal_async(struct txn *txn) assert(local_row == remote_row + txn->n_new_rows); /* Send the entry to the journal. */ - if (journal_write(req) < 0) { + if (journal_write_async(req) < 0) { diag_set(ClientError, ER_WAL_IO); diag_log(); return -1; @@ -583,7 +577,6 @@ txn_write(struct txn *txn) fiber_set_txn(fiber(), NULL); return 0; } - fiber_set_txn(fiber(), NULL); return txn_write_to_wal_async(txn); } diff --git a/src/box/txn.h b/src/box/txn.h index ae2c3a58f..fe13ef5f8 100644 --- a/src/box/txn.h +++ b/src/box/txn.h @@ -256,6 +256,15 @@ in_txn(void) return fiber()->storage.txn; } +/** + * Set pointer to the current transaction (if any). + */ +static inline void +fiber_set_txn(struct fiber *fiber, struct txn *txn) +{ + fiber->storage.txn = txn; +} + /** * Start a transaction explicitly. * @pre no transaction is active -- 2.20.1
next prev parent reply other threads:[~2020-02-19 18:38 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-19 18:36 [Tarantool-patches] [PATCH 00/14] rework async and sync transactions Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 01/14] box/txn: fix void args mess Cyrill Gorcunov 2020-02-20 14:10 ` Nikita Pettik 2020-02-20 14:16 ` Cyrill Gorcunov 2020-02-20 14:34 ` Nikita Pettik 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 02/14] box/journal: use plain int for return value Cyrill Gorcunov 2020-02-20 14:11 ` Nikita Pettik 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 03/14] box/journal: sanitize completion naming Cyrill Gorcunov 2020-02-20 14:12 ` Nikita Pettik 2020-02-20 14:15 ` Nikita Pettik 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 04/14] box/txn: rename txn_entry_done_cb to txn_entry_complete_cb Cyrill Gorcunov 2020-02-20 14:15 ` Nikita Pettik 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 05/14] box/txn: rename txn_write_to_wal to txn_write_to_wal_async Cyrill Gorcunov 2020-02-19 18:37 ` Cyrill Gorcunov [this message] 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 07/14] box/txn: rename txn_write to txn_commit_async Cyrill Gorcunov 2020-02-22 20:28 ` Georgy Kirichenko 2020-02-22 21:00 ` Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 08/14] box/txn: move setup of transaction start time to txn_prepare Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 09/14] box/txn: make txn nop processing a separate routine Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 10/14] box/txn: move journal entry allocation into " Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 11/14] box/txn: merge txn_write_to_wal_async to txn_commit_async Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 12/14] box/txn: do not use journal_write_async under the hood Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 13/14] box/journal: introduce journal_write Cyrill Gorcunov 2020-02-19 18:37 ` [Tarantool-patches] [PATCH 14/14] box/txn: use journal_write in txn_commit Cyrill Gorcunov 2020-02-19 19:09 ` Konstantin Osipov 2020-02-19 20:01 ` Cyrill Gorcunov
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=20200219183713.17646-7-gorcunov@gmail.com \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 06/14] box/journal: supersede journal_write with journal_write_async' \ /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