[Sheepdog] [PATCH] simplify the usage of sd_node_list and cpg_node_list

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Fri Apr 9 18:28:48 CEST 2010


We currently do:

1. when we find the node on corosync, we allocate the node and add it
to cpg_node_list.

2. when the node joins sheepdog (completes the JOIN process), we
allocate the node and add it to sd_node_list.


This patch simplifies the above:

1. when we find the node on corosync, we allocate the node and add it
to cpg_node_list.

2. when the node joins sheepdog (completes the JOIN process), we
move the node from cpg_node_list to sd_node_list.

The node is on cpg_node_list _OR_ sd_node_list.

I thought about managing the nodes on a single list but the code
doesn't look simpler than this approach.

I also add some comments.

Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 collie/collie.h |    5 ++++
 collie/group.c  |   62 +++++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/collie/collie.h b/collie/collie.h
index 1d066ad..826ac3a 100644
--- a/collie/collie.h
+++ b/collie/collie.h
@@ -65,8 +65,13 @@ struct cluster_info {
 	uint32_t epoch;
 	uint32_t status;
 
+	/*
+	 * we add a node to cpg_node_list in confchg then move it to
+	 * sd_node_list when the node joins sheepdog.
+	 */
 	struct list_head cpg_node_list;
 	struct list_head sd_node_list;
+
 	int node_list_idx;
 	struct list_head vm_list;
 	struct list_head pending_list;
diff --git a/collie/group.c b/collie/group.c
index 276ed91..3df4930 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -495,11 +495,28 @@ static void get_vdi_bitmap_from_all(void)
 	}
 }
 
+static int move_node_to_sd_list(uint32_t nodeid, uint32_t pid,
+				struct sheepdog_node_list_entry ent)
+{
+	struct node *node;
+
+	node = find_node(&sys->cpg_node_list, nodeid, pid);
+	if (!node)
+		return 1;
+
+	if (!node->ent.id)
+		node->ent = ent;
+
+	list_del(&node->list);
+	list_add_tail(&node->list, &sys->sd_node_list);
+
+	return 0;
+}
+
 static void update_cluster_info(struct join_message *msg)
 {
 	int i;
 	int ret, nr_nodes = msg->nr_nodes;
-	struct node *node;
 	struct sheepdog_node_list_entry entry[SD_MAX_NODES];
 
 	if (!sys->nr_sobjs)
@@ -509,16 +526,16 @@ static void update_cluster_info(struct join_message *msg)
 		goto out;
 
 	for (i = 0; i < nr_nodes; i++) {
-		node = find_node(&sys->cpg_node_list, msg->nodes[i].nodeid,
-				 msg->nodes[i].pid);
-		if (!node)
-			continue;
-
-		if (!node->ent.id)
-			node->ent = msg->nodes[i].ent;
-
-		add_node(&sys->sd_node_list, msg->nodes[i].nodeid, msg->nodes[i].pid,
-			 &msg->nodes[i].ent);
+		ret = move_node_to_sd_list(msg->nodes[i].nodeid,
+					   msg->nodes[i].pid,
+					   msg->nodes[i].ent);
+		/*
+		 * the node belonged to sheepdog when the master build
+		 * the JOIN response however it has gone.
+		 */
+		if (ret)
+			vprintf(SDOG_INFO "nodeid: %x, pid: %d has gone\n",
+				msg->nodes[i].nodeid, msg->nodes[i].pid);
 	}
 
 	sys->synchronized = 1;
@@ -542,7 +559,14 @@ static void update_cluster_info(struct join_message *msg)
 	}
 
 out:
-	add_node(&sys->sd_node_list, msg->nodeid, msg->pid, &msg->header.from);
+	ret = move_node_to_sd_list(msg->nodeid, msg->pid, msg->header.from);
+	/*
+	 * this should not happen since __sd_deliver() checks if the
+	 * host from msg on cpg_node_list.
+	 */
+	if (ret)
+		vprintf(SDOG_ERR "nodeid: %x, pid: %d has gone\n",
+			msg->nodeid, msg->pid);
 
 	if (sys->status == SD_STATUS_OK) {
 		nr_nodes = get_ordered_sd_node_list(entry);
@@ -902,12 +926,7 @@ static void __sd_confch(struct work *work, int idx)
 	}
 
 	for (i = 0; i < left_list_entries; i++) {
-		node = find_node(&sys->cpg_node_list, left_list[i].nodeid, left_list[i].pid);
-		if (node) {
-			list_del(&node->list);
-			free(node);
-		} else
-			eprintf("System error\n");
+		/* the node must be on sd_node_list or cpg_node_list. */
 
 		node = find_node(&sys->sd_node_list, left_list[i].nodeid, left_list[i].pid);
 		if (node) {
@@ -927,6 +946,13 @@ static void __sd_confch(struct work *work, int idx)
 
 				update_epoch_store(sys->epoch);
 			}
+		} else {
+			node = find_node(&sys->cpg_node_list, left_list[i].nodeid,
+					 left_list[i].pid);
+			if (node) {
+				list_del(&node->list);
+				free(node);
+			}
 		}
 	}
 
-- 
1.6.5




More information about the sheepdog mailing list