From: Cyrill Gorcunov <gorcunov@gmail.com> To: tml <tarantool-patches@dev.tarantool.org> Cc: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Subject: [Tarantool-patches] [PATCH v8 5/9] qsync: direct write of CONFIRM/ROLLBACK into a journal Date: Mon, 17 Aug 2020 16:39:14 +0300 [thread overview] Message-ID: <20200817133918.875558-6-gorcunov@gmail.com> (raw) In-Reply-To: <20200817133918.875558-1-gorcunov@gmail.com> When we need to write CONFIRM or ROLLBACK message (which is a binary record in msgpack format) into a journal we use txn code to allocate a new transaction, encode there a message and pass it to walk the long txn path before it hit the journal. This is not only resource wasting but also somehow strange from architectural point of view. Instead lets encode a record on the stack and write it to the journal directly. Part-of #5129 Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> --- src/box/txn_limbo.c | 64 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c index ed8c10419..447630d23 100644 --- a/src/box/txn_limbo.c +++ b/src/box/txn_limbo.c @@ -32,6 +32,7 @@ #include "txn_limbo.h" #include "replication.h" #include "iproto_constants.h" +#include "journal.h" struct txn_limbo txn_limbo; @@ -272,6 +273,17 @@ txn_limbo_wait_complete(struct txn_limbo *limbo, struct txn_limbo_entry *entry) return 0; } +/** + * A callback for synchronous write: txn_limbo_write_synchro fiber + * waiting to proceed once a record is written to WAL. + */ +static void +txn_limbo_write_cb(struct journal_entry *entry) +{ + assert(entry->complete_data != NULL); + fiber_wakeup(entry->complete_data); +} + static void txn_limbo_write_synchro(struct txn_limbo *limbo, uint32_t type, int64_t lsn) { @@ -284,46 +296,34 @@ txn_limbo_write_synchro(struct txn_limbo *limbo, uint32_t type, int64_t lsn) /* * This is a synchronous commit so we can - * use body and row allocated on a stack. + * allocate everything on a stack. */ struct synchro_body_bin body; struct xrow_header row; - struct request request = { - .header = &row, - }; + char buf[sizeof(struct journal_entry) + + sizeof(struct xrow_header *)]; - struct txn *txn = txn_begin(); - if (txn == NULL) - goto rollback; + struct journal_entry *entry = (struct journal_entry *)buf; + entry->rows[0] = &row; xrow_encode_synchro(&row, &body, &req); - /* - * This is not really a transaction. It just uses txn API - * to put the data into WAL. And obviously it should not - * go to the limbo and block on the very same sync - * transaction which it tries to confirm now. - */ - txn_set_flag(txn, TXN_FORCE_ASYNC); - - if (txn_begin_stmt(txn, NULL) != 0) - goto rollback; - if (txn_commit_stmt(txn, &request) != 0) - goto rollback; - if (txn_commit(txn) != 0) - goto rollback; - return; + journal_entry_create(entry, 1, xrow_approx_len(&row), + txn_limbo_write_cb, fiber()); -rollback: - /* - * XXX: the stub is supposed to be removed once it is defined what to do - * when a synchro request WAL write fails. One of the possible - * solutions: log the error, keep the limbo queue as is and probably put - * in rollback mode. Then provide a hook to call manually when WAL - * problems are fixed. Or retry automatically with some period. - */ - panic("Could not write a synchro request to WAL: lsn = %lld, type = " - "%s\n", lsn, iproto_type_name(type)); + if (journal_write(entry) != 0 || entry->res < 0) { + diag_set(ClientError, ER_WAL_IO); + diag_log(); + /* + * XXX: the stub is supposed to be removed once it is defined what to do + * when a synchro request WAL write fails. One of the possible + * solutions: log the error, keep the limbo queue as is and probably put + * in rollback mode. Then provide a hook to call manually when WAL + * problems are fixed. Or retry automatically with some period. + */ + panic("Could not write a synchro request to WAL: lsn = %lld, type = " + "%s\n", lsn, type == IPROTO_CONFIRM ? "CONFIRM" : "ROLLBACK"); + } } /** -- 2.26.2
next prev parent reply other threads:[~2020-08-17 13:40 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-17 13:39 [Tarantool-patches] [PATCH v8 0/9] qsync: write CONFIRM/ROLLBACK without txn engine Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 1/9] xrow: introduce struct synchro_request Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 2/9] journal: bind asynchronous write completion to an entry Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 3/9] journal: add journal_entry_create helper Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 4/9] qsync: provide a binary form of syncro entries Cyrill Gorcunov 2020-08-17 13:39 ` Cyrill Gorcunov [this message] 2020-08-17 20:49 ` [Tarantool-patches] [PATCH v8 5/9] qsync: direct write of CONFIRM/ROLLBACK into a journal Vladislav Shpilevoy 2020-08-17 22:16 ` Cyrill Gorcunov 2020-08-17 22:23 ` Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 6/9] applier: add shorthands to queue access Cyrill Gorcunov 2020-08-17 20:49 ` Vladislav Shpilevoy 2020-08-17 22:14 ` Cyrill Gorcunov 2020-08-18 19:18 ` Vladislav Shpilevoy 2020-08-19 20:37 ` Vladislav Shpilevoy 2020-08-19 20:49 ` Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 7/9] applier: process synchro requests without txn engine Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 8/9] txn: txn_add_redo -- drop synchro processing Cyrill Gorcunov 2020-08-17 13:39 ` [Tarantool-patches] [PATCH v8 9/9] xrow: drop xrow_header_dup_body Cyrill Gorcunov 2020-08-17 21:24 ` [Tarantool-patches] [PATCH v8 0/9] qsync: write CONFIRM/ROLLBACK without txn engine Vladislav Shpilevoy 2020-08-17 21:54 ` 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=20200817133918.875558-6-gorcunov@gmail.com \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v8 5/9] qsync: direct write of CONFIRM/ROLLBACK into a journal' \ /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