From: Serge Petrenko <sergepetrenko@tarantool.org> To: v.shpilevoy@tarantool.org, gorcunov@tarantool.org, sergos@tarantool.org, lvasiliev@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH 3/4] replication: delay initial join until confirmation Date: Mon, 29 Jun 2020 18:32:27 +0300 [thread overview] Message-ID: <956e432672dded1f7e3621e71adbbfd732e7c521.1593444131.git.sergepetrenko@tarantool.org> (raw) In-Reply-To: <cover.1593444131.git.sergepetrenko@tarantool.org> All the data that master sends during the join stage (both initial and final) is embedded into the first snapshot created on replica, so this data mustn't contain any unconfirmed or rolled back synchronous transactions. Make sure that master starts sending the initial data, which contains a snapshot-like dump of all the spaces only after the latest synchronous tx it has is confirmed. In case of rollback, the replica may retry joining. Part of #5097 --- src/box/applier.cc | 9 +++++++++ src/box/relay.cc | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/box/applier.cc b/src/box/applier.cc index 2d1047d43..5895afc31 100644 --- a/src/box/applier.cc +++ b/src/box/applier.cc @@ -1183,6 +1183,15 @@ applier_f(va_list ap) applier_log_error(applier, e); applier_disconnect(applier, APPLIER_LOADING); goto reconnect; + } else if (e->errcode() == ER_SYNC_QUORUM_TIMEOUT || + e->errcode() == ER_SYNC_ROLLBACK) { + /* + * Join failure due to synchronous + * transaction rollback. + */ + applier_log_error(applier, e); + applier_disconnect(applier, APPLIER_LOADING); + goto reconnect; } else if (e->errcode() == ER_CFG || e->errcode() == ER_ACCESS_DENIED || e->errcode() == ER_NO_SUCH_USER || diff --git a/src/box/relay.cc b/src/box/relay.cc index 29588b6ca..a7843a8c2 100644 --- a/src/box/relay.cc +++ b/src/box/relay.cc @@ -321,6 +321,13 @@ relay_initial_join(int fd, uint64_t sync, struct vclock *vclock) if (wal_sync(vclock) != 0) diag_raise(); + /* + * Start sending data only when the latest sync + * transaction is confirmed. + */ + if (txn_limbo_wait_confirm(&txn_limbo) != 0) + diag_raise(); + /* Respond to the JOIN request with the current vclock. */ struct xrow_header row; xrow_encode_vclock_xc(&row, vclock); -- 2.24.3 (Apple Git-128)
next prev parent reply other threads:[~2020-06-29 15:32 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-06-29 15:32 [Tarantool-patches] [PATCH 0/4] make master send only confirmed data during join Serge Petrenko 2020-06-29 15:32 ` [Tarantool-patches] [PATCH 1/4] [tosquash] move wait_confirm from gc.c to txn_limbo.c Serge Petrenko 2020-06-29 15:32 ` [Tarantool-patches] [PATCH 2/4] txn_limbo: add diag_set in txn_limbo_wait_confirm Serge Petrenko 2020-06-29 15:32 ` Serge Petrenko [this message] 2020-06-29 15:32 ` [Tarantool-patches] [PATCH 4/4] replication: only send confirmed data during final join Serge Petrenko 2020-06-29 21:14 ` [Tarantool-patches] [PATCH 0/4] make master send only confirmed data during join Vladislav Shpilevoy
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=956e432672dded1f7e3621e71adbbfd732e7c521.1593444131.git.sergepetrenko@tarantool.org \ --to=sergepetrenko@tarantool.org \ --cc=gorcunov@tarantool.org \ --cc=lvasiliev@tarantool.org \ --cc=sergos@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 3/4] replication: delay initial join until confirmation' \ /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