From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp55.i.mail.ru (smtp55.i.mail.ru [217.69.128.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 390C34696C3 for ; Tue, 18 Feb 2020 20:37:25 +0300 (MSK) From: Serge Petrenko Date: Tue, 18 Feb 2020 20:37:05 +0300 Message-Id: <257cb279bd1b62ef6ff98aa4fa7226ba1bf3b2d0.1582046958.git.sergepetrenko@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v3 2/4] recovery: allow to ignore rows coming from a certain instance List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org, alexander.turenko@tarantool.org, kostja.osipov@gmail.com Cc: tarantool-patches@dev.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)