[Sheepdog] [PATCH 3/4] sheep: add two helpers to get nodes number from list and epoch

Liu Yuan namei.unix at gmail.com
Sun Sep 18 05:33:29 CEST 2011


From: Liu Yuan <tailai.ly at taobao.com>

get_nodes_nr_epoch() is supposed for later patch set use.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/group.c |   29 ++++++++++++++++++++++-------
 1 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index 032d44c..cd8dd7b 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -376,6 +376,26 @@ static int is_master(void)
 	return 0;
 }
 
+static inline int get_nodes_nr_from(struct list_head *l)
+{
+	struct node *node;
+	int nr = 0;
+	list_for_each_entry(node, l, list) {
+		nr++;
+	}
+	return nr;
+}
+
+static int get_nodes_nr_epoch(int epoch)
+{
+	struct sheepdog_node_list_entry nodes[SD_MAX_NODES];
+	int nr;
+
+	nr = epoch_log_read(epoch, (char *)nodes, sizeof(nodes));
+	nr /= sizeof(nodes[0]);
+	return nr;
+}
+
 static int get_cluster_status(struct sheepdog_node_list_entry *from,
 			      struct sheepdog_node_list_entry *entries,
 			      int nr_entries, uint64_t ctime, uint32_t epoch,
@@ -458,10 +478,7 @@ static int get_cluster_status(struct sheepdog_node_list_entry *from,
 			return SD_RES_INVALID_EPOCH;
 		}
 
-		nr_entries = 1;
-		list_for_each_entry(node, &sys->sd_node_list, list) {
-			nr_entries++;
-		}
+		nr_entries = get_nodes_nr_from(&sys->sd_node_list) + 1;
 
 		if (nr_entries != nr_local_entries)
 			return SD_RES_SUCCESS;
@@ -1088,9 +1105,7 @@ static int check_majority(struct cpg_address *left_list,
 	if (left_list_entries == 0)
 		return 1; /* we don't need this check in this case */
 
-	list_for_each_entry(node, &sys->sd_node_list, list) {
-		nr_nodes++;
-	}
+	nr_nodes = get_nodes_nr_from(&sys->sd_node_list);
 	nr_majority = nr_nodes / 2 + 1;
 
 	/* we need at least 3 nodes to handle network partition
-- 
1.7.5.1




More information about the sheepdog mailing list