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