From: sergepetrenko <sergepetrenko@tarantool.org> To: alexander.turenko@tarantool.org, v.shpilevoy@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH 1/2] replication: correctly check for rows to skip in applier Date: Thu, 13 Feb 2020 02:51:00 +0300 [thread overview] Message-ID: <85cfed8fd0cfa23c5a8504b6516fad18028edbaf.1581551227.git.sergepetrenko@tarantool.org> (raw) In-Reply-To: <cover.1581551227.git.sergepetrenko@tarantool.org> Fix replicaset.applier.vclock initialization issues: it wasn't initialized at all previously. Moreover, there is no valid point in code to initialize it, since it may get stale right away if new entries are written to WAL. So, check for both applier and replicaset vclocks. The greater one protects the instance from applying the rows it has already applied or has already scheduled to write. Also remove an unnecessary aplier vclock initialization from replication_init(). Closes #4739 --- src/box/applier.cc | 14 ++++++++++++-- src/box/replication.cc | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/box/applier.cc b/src/box/applier.cc index ae3d281a5..acb26b7e2 100644 --- a/src/box/applier.cc +++ b/src/box/applier.cc @@ -731,8 +731,18 @@ applier_apply_tx(struct stailq *rows) struct latch *latch = (replica ? &replica->order_latch : &replicaset.applier.order_latch); latch_lock(latch); - if (vclock_get(&replicaset.applier.vclock, - first_row->replica_id) >= first_row->lsn) { + /* + * We cannot tell which vclock is greater. There is no + * proper place to initialize applier vclock, since it + * may get stale right away if we write something to WAL + * and it gets replicated and then arrives back from the + * replica. So check against both vclocks. Replicaset + * vclock will guard us from corner cases like the one + * above. + */ + if (MAX(vclock_get(&replicaset.applier.vclock, first_row->replica_id), + vclock_get(&replicaset.vclock, first_row->replica_id)) >= + first_row->lsn) { latch_unlock(latch); return 0; } diff --git a/src/box/replication.cc b/src/box/replication.cc index e7bfa22ab..7b04573a4 100644 --- a/src/box/replication.cc +++ b/src/box/replication.cc @@ -93,7 +93,6 @@ replication_init(void) latch_create(&replicaset.applier.order_latch); vclock_create(&replicaset.applier.vclock); - vclock_copy(&replicaset.applier.vclock, &replicaset.vclock); rlist_create(&replicaset.applier.on_rollback); rlist_create(&replicaset.applier.on_commit); -- 2.20.1 (Apple Git-117)
next prev parent reply other threads:[~2020-02-12 23:51 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-12 23:50 [Tarantool-patches] [PATCH 0/2] replication: fix applying of rows originating from local instance sergepetrenko 2020-02-12 23:51 ` sergepetrenko [this message] 2020-02-13 6:47 ` [Tarantool-patches] [PATCH 1/2] replication: correctly check for rows to skip in applier Konstantin Osipov 2020-02-13 6:58 ` Konstantin Osipov 2020-02-13 22:03 ` Sergey Petrenko 2020-02-13 22:10 ` Sergey Petrenko 2020-02-12 23:51 ` [Tarantool-patches] [PATCH 2/2] wal: panic when trying to write a record with a broken lsn sergepetrenko 2020-02-13 6:48 ` Konstantin Osipov 2020-02-13 22:05 ` Sergey Petrenko 2020-02-14 7:26 ` Konstantin Osipov 2020-02-13 6:48 ` [Tarantool-patches] [PATCH 0/2] replication: fix applying of rows originating from local instance Konstantin Osipov
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=85cfed8fd0cfa23c5a8504b6516fad18028edbaf.1581551227.git.sergepetrenko@tarantool.org \ --to=sergepetrenko@tarantool.org \ --cc=alexander.turenko@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 1/2] replication: correctly check for rows to skip in applier' \ /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