[Tarantool-patches] [PATCH v3 2/4] recovery: allow to ignore rows coming from a certain instance
Serge Petrenko
sergepetrenko at tarantool.org
Tue Feb 18 20:37:05 MSK 2020
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)
More information about the Tarantool-patches
mailing list