[server 3/5] replication: add helpers to set and clear replica applier

Vladimir Davydov vdavydov.dev at gmail.com
Wed Jan 24 20:44:52 MSK 2018


These operations are going to become more complicated than just setting
a pointer so let's introduce helpers for them.
---
 src/box/replication.cc | 48 +++++++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/box/replication.cc b/src/box/replication.cc
index 6e35a396..3100b679 100644
--- a/src/box/replication.cc
+++ b/src/box/replication.cc
@@ -179,6 +179,21 @@ replica_clear_id(struct replica *replica)
 }
 
 static void
+replica_set_applier(struct replica *replica, struct applier *applier)
+{
+	assert(replica->applier == NULL);
+	replica->applier = applier;
+}
+
+static void
+replica_clear_applier(struct replica *replica)
+{
+	assert(replica->applier != NULL);
+	replica->applier = NULL;
+	trigger_clear(&replica->on_connect);
+}
+
+static void
 replica_on_receive_uuid(struct trigger *trigger, void *event)
 {
 	struct replica *replica = container_of(trigger,
@@ -214,8 +229,8 @@ replica_on_receive_uuid(struct trigger *trigger, void *event)
 
 	if (orig != NULL) {
 		/* Use existing struct replica */
-		orig->applier = applier;
-		replica->applier = NULL;
+		replica_set_applier(orig, applier);
+		replica_clear_applier(replica);
 		replica_delete(replica);
 	} else {
 		/* Add a new struct replica */
@@ -235,6 +250,7 @@ replicaset_update(struct applier **appliers, int count)
 	replica_hash_new(&uniq);
 	RLIST_HEAD(anon_replicas);
 	struct replica *replica, *next;
+	struct applier *applier;
 
 	auto uniq_guard = make_scoped_guard([&]{
 		replica_hash_foreach_safe(&uniq, replica, next) {
@@ -245,9 +261,9 @@ replicaset_update(struct applier **appliers, int count)
 
 	/* Check for duplicate UUID */
 	for (int i = 0; i < count; i++) {
-		struct applier *applier = appliers[i];
+		applier = appliers[i];
 		replica = replica_new();
-		replica->applier = applier;
+		replica_set_applier(replica, applier);
 
 		if (applier->state != APPLIER_CONNECTED) {
 			/*
@@ -284,16 +300,17 @@ replicaset_update(struct applier **appliers, int count)
 	replicaset_foreach(replica) {
 		if (replica->applier == NULL)
 			continue;
-		applier_stop(replica->applier); /* cancels a background fiber */
-		applier_delete(replica->applier);
-		replica->applier = NULL;
+		applier = replica->applier;
+		replica_clear_applier(replica);
+		applier_stop(applier);
+		applier_delete(applier);
 	}
 	rlist_foreach_entry_safe(replica, &replicaset.anon, in_anon, next) {
-		assert(replica->applier != NULL);
-		applier_stop(replica->applier);
-		applier_delete(replica->applier);
-		replica->applier = NULL;
+		applier = replica->applier;
+		replica_clear_applier(replica);
 		replica_delete(replica);
+		applier_stop(applier);
+		applier_delete(applier);
 	}
 	rlist_create(&replicaset.anon);
 
@@ -305,12 +322,9 @@ replicaset_update(struct applier **appliers, int count)
 							   replica);
 		if (orig != NULL) {
 			/* Use existing struct replica */
-			orig->applier = replica->applier;
-			assert(tt_uuid_is_equal(&orig->uuid,
-						&orig->applier->uuid));
-			replica->applier = NULL;
-			replica_delete(replica); /* remove temporary object */
-			replica = orig;
+			replica_set_applier(orig, replica->applier);
+			replica_clear_applier(replica);
+			replica_delete(replica);
 		} else {
 			/* Add a new struct replica */
 			replica_hash_insert(&replicaset.hash, replica);
-- 
2.11.0




More information about the Tarantool-patches mailing list