From: Cyrill Gorcunov <gorcunov@gmail.com> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Cc: tml <tarantool-patches@dev.tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v3 5/6] qsync: implement direct write of CONFIRM/ROLLBACK into a journal Date: Tue, 28 Jul 2020 00:39:00 +0300 [thread overview] Message-ID: <20200727213900.GL60766@grain> (raw) In-Reply-To: <67376e86-126e-f6c7-1684-c69980e4860b@tarantool.org> On Mon, Jul 27, 2020 at 10:41:17PM +0200, Vladislav Shpilevoy wrote: > > + if (entry->res < 0) { > > I suggest simply add '|| entry->res < 0' to the check above. To > make a single error handling point. Done. Pushed to gorcunov/gh-5129-journal-4 --- From: Cyrill Gorcunov <gorcunov@gmail.com> Date: Thu, 23 Jul 2020 14:32:31 +0300 Subject: [PATCH 4/5] qsync: implement direct write of CONFIRM/ROLLBACK into a journal When we need to write CONFIRM or ROLLBACK message (which is just 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. Closes #5129 Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> --- src/box/txn_limbo.c | 90 ++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c index a74bfe244..f1c54d824 100644 --- a/src/box/txn_limbo.c +++ b/src/box/txn_limbo.c @@ -32,6 +32,9 @@ #include "txn_limbo.h" #include "replication.h" +#include "iproto_constants.h" +#include "journal.h" + struct txn_limbo txn_limbo; static inline void @@ -237,62 +240,67 @@ txn_limbo_wait_complete(struct txn_limbo *limbo, struct txn_limbo_entry *entry) return 0; } +/** + * A callback for synchronous write: txn_limbo_write 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); +} + +/** + * Write CONFIRM or ROLLBACK message to a journal directly + * without involving transaction engine because using txn + * engine is far from being cheap while we only need to + * write a small journal entry. + */ static int -txn_limbo_write_confirm_rollback(struct txn_limbo *limbo, int64_t lsn, - bool is_confirm) +txn_limbo_write(uint32_t replica_id, int64_t lsn, int type) { + assert(replica_id != REPLICA_ID_NIL); + assert(type == IPROTO_CONFIRM || type == IPROTO_ROLLBACK); assert(lsn > 0); + /* + * When allocated statically some compilers (such as + * clang + asan) requires the journal_entry::rows to + * be last in a container structure. So it it simplier + * just to create a cummulative buffer. + */ + char buf[sizeof(struct journal_entry) + + sizeof(struct xrow_header *)]; + + struct synchro_body_bin body_bin; struct xrow_header row; - struct request request = { - .header = &row, - }; - struct txn *txn = txn_begin(); - if (txn == NULL) - return -1; + struct journal_entry *entry = (struct journal_entry *)buf; + entry->rows[0] = &row; - int res = 0; - if (is_confirm) { - res = xrow_encode_confirm(&row, &txn->region, - limbo->instance_id, lsn); - } else { - /* - * This LSN is the first to be rolled back, so - * the last "safe" lsn is lsn - 1. - */ - res = xrow_encode_rollback(&row, &txn->region, - limbo->instance_id, lsn); - } - if (res == -1) - goto rollback; - /* - * 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); + xrow_encode_synchro(&row, &body_bin, replica_id, lsn, type); - if (txn_begin_stmt(txn, NULL) != 0) - goto rollback; - if (txn_commit_stmt(txn, &request) != 0) - goto rollback; + journal_entry_create(entry, 1, xrow_approx_len(&row), + txn_limbo_write_cb, fiber()); - return txn_commit(txn); -rollback: - txn_rollback(txn); - return -1; + if (journal_write(entry) != 0 || entry->res < 0) { + diag_set(ClientError, ER_WAL_IO); + diag_log(); + return -1; + } + + return 0; } /** * Write a confirmation entry to WAL. After it's written all the * transactions waiting for confirmation may be finished. */ -static int +static inline int txn_limbo_write_confirm(struct txn_limbo *limbo, int64_t lsn) { - return txn_limbo_write_confirm_rollback(limbo, lsn, true); + return txn_limbo_write(limbo->instance_id, lsn, IPROTO_CONFIRM); } void @@ -338,10 +346,10 @@ txn_limbo_read_confirm(struct txn_limbo *limbo, int64_t lsn) * transactions following the current one and waiting for * confirmation must be rolled back. */ -static int +static inline int txn_limbo_write_rollback(struct txn_limbo *limbo, int64_t lsn) { - return txn_limbo_write_confirm_rollback(limbo, lsn, false); + return txn_limbo_write(limbo->instance_id, lsn, IPROTO_ROLLBACK); } void -- 2.26.2
next prev parent reply other threads:[~2020-07-27 21:39 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-27 14:06 [Tarantool-patches] [PATCH v3 0/6] qsync: write CONFIRM/ROLLBACK without txn engine Cyrill Gorcunov 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 1/6] journal: drop redundant declaration Cyrill Gorcunov 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 2/6] journal: bind asynchronous write completion to an entry Cyrill Gorcunov 2020-07-27 20:40 ` Vladislav Shpilevoy 2020-07-27 21:37 ` Cyrill Gorcunov 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 3/6] journal: add journal_entry_create helper Cyrill Gorcunov 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 4/6] qsync: provide a binary form of syncro entries Cyrill Gorcunov 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 5/6] qsync: implement direct write of CONFIRM/ROLLBACK into a journal Cyrill Gorcunov 2020-07-27 20:41 ` Vladislav Shpilevoy 2020-07-27 21:39 ` Cyrill Gorcunov [this message] 2020-07-27 14:06 ` [Tarantool-patches] [PATCH v3 6/6] qsync: drop no longer used encoding helpers Cyrill Gorcunov 2020-07-27 14:12 ` [Tarantool-patches] [PATCH v3 0/6] qsync: write CONFIRM/ROLLBACK without txn engine 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=20200727213900.GL60766@grain \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v3 5/6] qsync: implement 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