From: Serge Petrenko <sergepetrenko@tarantool.org>
To: v.shpilevoy@tarantool.org, alexander.turenko@tarantool.org,
kostja.osipov@gmail.com
Cc: tarantool-patches@dev.tarantool.org
Subject: [Tarantool-patches] [PATCH v3 2/4] recovery: allow to ignore rows coming from a certain instance
Date: Tue, 18 Feb 2020 20:37:05 +0300 [thread overview]
Message-ID: <257cb279bd1b62ef6ff98aa4fa7226ba1bf3b2d0.1582046958.git.sergepetrenko@tarantool.org> (raw)
In-Reply-To: <cover.1582046958.git.sergepetrenko@tarantool.org>
Prerequisite #4739
---
src/box/box.cc | 2 +-
src/box/recovery.cc | 12 +++++++++++-
src/box/recovery.h | 7 ++++++-
src/box/relay.cc | 4 ++--
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/box/box.cc b/src/box/box.cc
index 0290578b2..a4d823df0 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -2171,7 +2171,7 @@ local_recovery(const struct tt_uuid *instance_uuid,
struct recovery *recovery;
recovery = recovery_new(cfg_gets("wal_dir"),
cfg_geti("force_recovery"),
- checkpoint_vclock);
+ checkpoint_vclock, 0);
/*
* Make sure we report the actual recovery position
diff --git a/src/box/recovery.cc b/src/box/recovery.cc
index 64aa467b1..e6d6b5744 100644
--- a/src/box/recovery.cc
+++ b/src/box/recovery.cc
@@ -81,7 +81,7 @@
*/
struct recovery *
recovery_new(const char *wal_dirname, bool force_recovery,
- const struct vclock *vclock)
+ const struct vclock *vclock, unsigned int id_ignore_map)
{
struct recovery *r = (struct recovery *)
calloc(1, sizeof(*r));
@@ -101,6 +101,8 @@ recovery_new(const char *wal_dirname, bool force_recovery,
vclock_copy(&r->vclock, vclock);
+ r->id_ignore_map = id_ignore_map;
+
/**
* Avoid scanning WAL dir before we recovered
* the snapshot and know instance UUID - this will
@@ -275,6 +277,14 @@ recover_xlog(struct recovery *r, struct xstream *stream,
* failed row anyway.
*/
vclock_follow_xrow(&r->vclock, &row);
+ /*
+ * Do not try to apply rows coming from an
+ * ignored instance, but still follow their lsns
+ * to make sure recovery vclock stays the same as
+ * the one emerging from local recovery.
+ */
+ if (1 << row.replica_id & r->id_ignore_map)
+ continue;
if (xstream_write(stream, &row) == 0) {
++row_count;
if (row_count % 100000 == 0)
diff --git a/src/box/recovery.h b/src/box/recovery.h
index 6e68abc0b..2e10b7064 100644
--- a/src/box/recovery.h
+++ b/src/box/recovery.h
@@ -50,6 +50,11 @@ struct recovery {
/** The WAL cursor we're currently reading/writing from/to. */
struct xlog_cursor cursor;
struct xdir wal_dir;
+ /**
+ * A map of replica ids whose changes will be silently
+ * ignored on recovery.
+ */
+ unsigned int id_ignore_map;
/**
* This fiber is used in local hot standby mode.
* It looks for changes in the wal_dir and applies
@@ -62,7 +67,7 @@ struct recovery {
struct recovery *
recovery_new(const char *wal_dirname, bool force_recovery,
- const struct vclock *vclock);
+ const struct vclock *vclock, unsigned int id_ignore_map);
void
recovery_delete(struct recovery *r);
diff --git a/src/box/relay.cc b/src/box/relay.cc
index b89632273..741a09201 100644
--- a/src/box/relay.cc
+++ b/src/box/relay.cc
@@ -355,7 +355,7 @@ relay_final_join(int fd, uint64_t sync, struct vclock *start_vclock,
});
relay->r = recovery_new(cfg_gets("wal_dir"), false,
- start_vclock);
+ start_vclock, 0);
vclock_copy(&relay->stop_vclock, stop_vclock);
int rc = cord_costart(&relay->cord, "final_join",
@@ -701,7 +701,7 @@ relay_subscribe(struct replica *replica, int fd, uint64_t sync,
vclock_copy(&relay->local_vclock_at_subscribe, &replicaset.vclock);
relay->r = recovery_new(cfg_gets("wal_dir"), false,
- replica_clock);
+ replica_clock, 0);
vclock_copy(&relay->tx.vclock, replica_clock);
relay->version_id = replica_version_id;
--
2.21.1 (Apple Git-122.3)
next prev parent reply other threads:[~2020-02-18 17:37 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-18 17:37 [Tarantool-patches] [PATCH v3 0/4] replication: fix applying of rows originating from local instance Serge Petrenko
2020-02-18 17:37 ` [Tarantool-patches] [PATCH v3 1/4] box: expose box_is_orphan method Serge Petrenko
2020-02-18 17:37 ` Serge Petrenko [this message]
2020-02-18 19:03 ` [Tarantool-patches] [PATCH v3 2/4] recovery: allow to ignore rows coming from a certain instance Konstantin Osipov
2020-02-19 8:43 ` Serge Petrenko
2020-02-19 8:52 ` Konstantin Osipov
2020-02-19 8:57 ` Serge Petrenko
2020-02-19 9:02 ` Konstantin Osipov
2020-02-19 9:35 ` Serge Petrenko
2020-02-19 10:11 ` Konstantin Osipov
2020-02-19 10:31 ` Serge Petrenko
2020-02-19 11:27 ` Konstantin Osipov
2020-02-18 17:37 ` [Tarantool-patches] [PATCH v3 3/4] replication: do not relay rows coming from a remote instance back to it Serge Petrenko
2020-02-18 19:07 ` Konstantin Osipov
2020-02-18 17:37 ` [Tarantool-patches] [PATCH v3 4/4] wal: warn when trying to write a record with a broken lsn Serge Petrenko
2020-02-22 20:21 ` [Tarantool-patches] [PATCH v3 0/4] replication: fix applying of rows originating from local instance Georgy Kirichenko
2020-02-22 20:49 ` Konstantin Osipov
2020-02-23 8:16 ` Georgy Kirichenko
2020-02-24 10:18 ` Konstantin Osipov
2020-02-24 12:31 ` Георгий Кириченко
2020-02-26 10:09 ` Sergey Petrenko
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=257cb279bd1b62ef6ff98aa4fa7226ba1bf3b2d0.1582046958.git.sergepetrenko@tarantool.org \
--to=sergepetrenko@tarantool.org \
--cc=alexander.turenko@tarantool.org \
--cc=kostja.osipov@gmail.com \
--cc=tarantool-patches@dev.tarantool.org \
--cc=v.shpilevoy@tarantool.org \
--subject='Re: [Tarantool-patches] [PATCH v3 2/4] recovery: allow to ignore rows coming from a certain instance' \
/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