[Sheepdog] [PATCH] collie: fix node addition bug

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Mon Apr 5 20:32:08 CEST 2010


Newly added machine needs to get current epoch number from the master
if cluster has already started.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 collie/group.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/collie/group.c b/collie/group.c
index 570464b..a2d7425 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -53,7 +53,7 @@ struct join_message {
 	uint32_t nr_nodes;
 	uint32_t nr_sobjs;
 	uint32_t cluster_status;
-	uint32_t pad;
+	uint32_t epoch;
 	struct {
 		uint32_t nodeid;
 		uint32_t pid;
@@ -411,6 +411,10 @@ static void join(struct join_message *msg)
 
 	msg->nr_sobjs = sys->nr_sobjs;
 	msg->nr_nodes = 0;
+	if (sys->status == SD_STATUS_OK)
+		msg->epoch = sys->epoch;
+	else
+		msg->epoch = 0;
 	list_for_each_entry(node, &sys->cpg_node_list, list) {
 		if (node->nodeid == msg->nodeid && node->pid == msg->pid)
 			continue;
@@ -515,7 +519,14 @@ static void update_cluster_info(struct join_message *msg)
 
 	sys->synchronized = 1;
 
-	eprintf("system status = %d\n", msg->cluster_status);
+	if (sys->status == SD_STATUS_STARTUP && msg->cluster_status == SD_STATUS_OK) {
+		if (msg->epoch > 0) {
+			sys->epoch = msg->epoch;
+			sys->status = SD_STATUS_OK;
+		}
+	}
+
+	eprintf("system status = %d, epoch = %d\n", msg->cluster_status, sys->epoch);
 	if (sys->status == SD_STATUS_OK) {
 		nr_nodes = build_node_list(&sys->sd_node_list, entry);
 
@@ -545,8 +556,10 @@ out:
 
 	print_node_list(&sys->sd_node_list);
 
-	if (sys->status == SD_STATUS_STARTUP && msg->cluster_status == SD_STATUS_OK)
-		sys->epoch = get_latest_epoch();
+	if (sys->status == SD_STATUS_STARTUP && msg->cluster_status == SD_STATUS_OK) {
+		if (msg->epoch == 0)
+			sys->epoch = get_latest_epoch();
+	}
 
 	if (sys->status != SD_STATUS_INCONSISTENT_EPOCHS) {
 		if (msg->cluster_status == SD_STATUS_OK) {
-- 
1.5.6.5




More information about the sheepdog mailing list