From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (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 A5FE144643E for ; Wed, 30 Sep 2020 01:11:45 +0300 (MSK) From: Vladislav Shpilevoy Date: Wed, 30 Sep 2020 00:11:26 +0200 Message-Id: <764a548a00ac37845e7fc10457e6188a8c1848fe.1601417273.git.v.shpilevoy@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v3 04/10] replication: track registered replica count List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, sergepetrenko@tarantool.org 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 | 4 +++- src/box/replication.h | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/box/replication.cc b/src/box/replication.cc index c1fcdb660..c19f8c693 100644 --- a/src/box/replication.cc +++ b/src/box/replication.cc @@ -247,7 +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; say_info("assigned id %d to replica %s", replica->id, tt_uuid_str(&replica->uuid)); replica->anon = false; @@ -267,6 +267,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)