From: Vladislav Shpilevoy via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: tarantool-patches@dev.tarantool.org, gorcunov@gmail.com, sergepetrenko@tarantool.org Subject: [Tarantool-patches] [PATCH 11/13] wal: introduce JOURNAL_ENTRY_ERR_CASCADE Date: Fri, 11 Jun 2021 23:56:07 +0200 [thread overview] Message-ID: <1fa72b7ab80f4375dab72b0c0fd9a1b86b1fb426.1623448465.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1623448465.git.v.shpilevoy@tarantool.org> A transaction in WAL thread could be rolled back not only due to an IO error. But also if there was a cascading rollback in progress. The patch makes such case use a special error code turned into its own diag when it reaches the TX thread. Usage of ER_WAL_IO wasn't correct here. Part of #6027 --- src/box/journal.c | 3 +++ src/box/journal.h | 5 +++++ src/box/txn.h | 1 + src/box/wal.c | 17 ++++++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/box/journal.c b/src/box/journal.c index 32c3e4bd7..7de149080 100644 --- a/src/box/journal.c +++ b/src/box/journal.c @@ -49,6 +49,9 @@ diag_set_journal_res_detailed(const char *file, unsigned line, int64_t res) case JOURNAL_ENTRY_ERR_IO: diag_set_detailed(file, line, ClientError, ER_WAL_IO); return; + case JOURNAL_ENTRY_ERR_CASCADE: + diag_set_detailed(file, line, ClientError, ER_CASCADE_ROLLBACK); + return; } panic("Journal result code %lld can't be converted to an error " "at %s:%u", (long long)res, file, line); diff --git a/src/box/journal.h b/src/box/journal.h index 18767176e..857245779 100644 --- a/src/box/journal.h +++ b/src/box/journal.h @@ -49,6 +49,11 @@ enum { JOURNAL_ENTRY_ERR_UNKNOWN = -1, /** Tried to be written, but something happened related to IO. */ JOURNAL_ENTRY_ERR_IO = -2, + /** + * Rollback because there is a not finished rollback of a previous + * entry. + */ + JOURNAL_ENTRY_ERR_CASCADE = -3, /** * Anchor for the structs built on top of journal entry so as they * could introduce their own unique errors. Set to a big value in diff --git a/src/box/txn.h b/src/box/txn.h index 037865ac6..7638854a7 100644 --- a/src/box/txn.h +++ b/src/box/txn.h @@ -110,6 +110,7 @@ enum { */ TXN_SIGNATURE_UNKNOWN = JOURNAL_ENTRY_ERR_UNKNOWN, TXN_SIGNATURE_IO = JOURNAL_ENTRY_ERR_IO, + TXN_SIGNATURE_CASCADE = JOURNAL_ENTRY_ERR_CASCADE, /** * The default signature value for failed transactions. * Indicates either write failure or any other failure diff --git a/src/box/wal.c b/src/box/wal.c index f59cc9113..8543c4a08 100644 --- a/src/box/wal.c +++ b/src/box/wal.c @@ -1036,6 +1036,7 @@ wal_write_to_disk(struct cmsg *msg) { struct wal_writer *writer = &wal_writer_singleton; struct wal_msg *wal_msg = (struct wal_msg *) msg; + int err_code = JOURNAL_ENTRY_ERR_UNKNOWN; struct stailq_entry *last_committed = NULL; struct journal_entry *entry; struct error *error; @@ -1059,16 +1060,19 @@ wal_write_to_disk(struct cmsg *msg) if (writer->is_in_rollback) { /* We're rolling back a failed write. */ + err_code = JOURNAL_ENTRY_ERR_CASCADE; goto done; } /* Xlog is only rotated between queue processing */ if (wal_opt_rotate(writer) != 0) { + err_code = JOURNAL_ENTRY_ERR_IO; goto done; } /* Ensure there's enough disk space before writing anything. */ if (wal_fallocate(writer, wal_msg->approx_len) != 0) { + err_code = JOURNAL_ENTRY_ERR_IO; goto done; } @@ -1104,8 +1108,10 @@ wal_write_to_disk(struct cmsg *msg) entry->res = vclock_sum(&vclock_diff) + vclock_sum(&writer->vclock); rc = xlog_write_entry(l, entry); - if (rc < 0) + if (rc < 0) { + err_code = JOURNAL_ENTRY_ERR_IO; goto done; + } if (rc > 0) { writer->checkpoint_wal_size += rc; last_committed = &entry->fifo; @@ -1114,8 +1120,10 @@ wal_write_to_disk(struct cmsg *msg) /* rc == 0: the write is buffered in xlog_tx */ } rc = xlog_flush(l); - if (rc < 0) + if (rc < 0) { + err_code= JOURNAL_ENTRY_ERR_IO; goto done; + } writer->checkpoint_wal_size += rc; last_committed = stailq_last(&wal_msg->commit); @@ -1167,12 +1175,15 @@ done: stailq_cut_tail(&wal_msg->commit, last_committed, &rollback); if (!stailq_empty(&rollback)) { + assert(err_code != JOURNAL_ENTRY_ERR_UNKNOWN); /* Update status of the successfully committed requests. */ stailq_foreach_entry(entry, &rollback, fifo) - entry->res = JOURNAL_ENTRY_ERR_IO; + entry->res = err_code; /* Rollback unprocessed requests */ stailq_concat(&wal_msg->rollback, &rollback); wal_begin_rollback(); + } else { + assert(err_code == JOURNAL_ENTRY_ERR_UNKNOWN); } fiber_gc(); wal_notify_watchers(writer, WAL_EVENT_WRITE); -- 2.24.3 (Apple Git-128)
next prev parent reply other threads:[~2021-06-11 21:57 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-11 21:56 [Tarantool-patches] [PATCH 00/13] Applier rollback reason Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 01/13] error: introduce ER_CASCADE_ROLLBACK Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 10/13] txn: install proper diag errors on txn fail Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` Vladislav Shpilevoy via Tarantool-patches [this message] 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 12/13] txn: introduce TXN_SIGNATURE_ABORT Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 13/13] txn: stop TXN_SIGNATURE_ABORT override Vladislav Shpilevoy via Tarantool-patches 2021-06-15 13:44 ` Serge Petrenko via Tarantool-patches 2021-06-15 19:34 ` Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 02/13] test: remove replica-applier-rollback.lua Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 03/13] journal: make journal_write() set diag on error Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 04/13] wal: refactor wal_write_to_disk() Vladislav Shpilevoy via Tarantool-patches 2021-06-15 20:46 ` Cyrill Gorcunov via Tarantool-patches 2021-06-16 6:22 ` Vladislav Shpilevoy via Tarantool-patches 2021-06-16 8:02 ` Cyrill Gorcunov via Tarantool-patches 2021-06-16 23:32 ` Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 05/13] diag: introduce diag_set_detailed() Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 06/13] wal: encapsulate ER_WAL_IO Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 07/13] txn: change limbo rollback check in the trigger Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 08/13] journal: introduce proper error codes Vladislav Shpilevoy via Tarantool-patches 2021-06-11 21:56 ` [Tarantool-patches] [PATCH 09/13] txn: assert after WAL write that txn is not done Vladislav Shpilevoy via Tarantool-patches 2021-06-15 13:43 ` [Tarantool-patches] [PATCH 00/13] Applier rollback reason Serge Petrenko via Tarantool-patches 2021-06-16 23:32 ` Vladislav Shpilevoy via Tarantool-patches
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=1fa72b7ab80f4375dab72b0c0fd9a1b86b1fb426.1623448465.git.v.shpilevoy@tarantool.org \ --to=tarantool-patches@dev.tarantool.org \ --cc=gorcunov@gmail.com \ --cc=sergepetrenko@tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 11/13] wal: introduce JOURNAL_ENTRY_ERR_CASCADE' \ /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