[Tarantool-patches] [PATCH v2 04/11] replication: track registered replica count
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Sep 10 02:16:55 MSK 2020
Struct replicaset didn't store a number of registered replicas.
Only an array, which was necessary to fullscan each time when want
to find the count.
That is going to be needed in Raft to calculate election quorum.
The patch makes the count tracked so as it could be found for
constant time by simply reading an integer.
Needed for #1146
---
src/box/replication.cc | 3 +++
src/box/replication.h | 7 +++++++
2 files changed, 10 insertions(+)
diff --git a/src/box/replication.cc b/src/box/replication.cc
index 744236b99..b9b098960 100644
--- a/src/box/replication.cc
+++ b/src/box/replication.cc
@@ -247,6 +247,7 @@ replica_set_id(struct replica *replica, uint32_t replica_id)
tt_uuid_str(&replica->uuid));
}
replicaset.replica_by_id[replica_id] = replica;
+ ++replicaset.registered_count;
if (replica->applier != NULL)
replica->applier->instance_id = replica_id;
say_info("assigned id %d to replica %s",
@@ -268,6 +269,8 @@ replica_clear_id(struct replica *replica)
* replication.
*/
replicaset.replica_by_id[replica->id] = NULL;
+ assert(replicaset.registered_count > 0);
+ --replicaset.registered_count;
if (replica->id == instance_id) {
/* See replica_check_id(). */
assert(replicaset.is_joining);
diff --git a/src/box/replication.h b/src/box/replication.h
index ddc2bddf4..3e46c592a 100644
--- a/src/box/replication.h
+++ b/src/box/replication.h
@@ -217,6 +217,13 @@ struct replicaset {
bool is_joining;
/* A number of anonymous replicas following this instance. */
int anon_count;
+ /**
+ * Number of registered replicas. That includes all of them - connected,
+ * disconnected, connected not directly, just present in _cluster. If an
+ * instance has an ID, has the same replicaset UUID, then it is
+ * accounted here.
+ */
+ int registered_count;
/** Applier state. */
struct {
/**
--
2.21.1 (Apple Git-122.3)
More information about the Tarantool-patches
mailing list