[Sheepdog] [PATCH S005 v3] Replace calls to node_cmp with a typesafe node_eq.

Shevek shevek at anarres.org
Mon May 14 23:40:45 CEST 2012


>From 8aa862162df385c73327820e4a6d61d8447bdecb Mon Sep 17 00:00:00 2001
From: Shevek <shevek at anarres.org>
Date: Wed, 9 May 2012 16:22:50 -0700
Subject: [PATCH] Replace calls to node_cmp with a typesafe node_eq.

Make node_eq typesafe, rather than accepting void *, since C99 will
allow us to accidentally cast any type pointer to a void * without
warning.

Signed-off-by: Shevek <shevek at anarres.org>
---
 include/sheep.h           |    5 +++++
 sheep/cluster/accord.c    |    2 +-
 sheep/cluster/local.c     |    4 ++--
 sheep/cluster/zookeeper.c |   15 +++++++++------
 sheep/group.c             |   18 +++++++++---------
 5 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/include/sheep.h b/include/sheep.h
index 7e287c4..0a47514 100644
--- a/include/sheep.h
+++ b/include/sheep.h
@@ -321,6 +321,11 @@ static inline int node_cmp(const void *a, const void *b)
 	return 0;
 }
 
+static inline int node_eq(const struct sd_node *a, const struct sd_node *b)
+{
+	return node_cmp(a, b) == 0;
+}
+
 static inline int vnode_cmp(const void *a, const void *b)
 {
 	const struct sd_vnode *node1 = a;
diff --git a/sheep/cluster/accord.c b/sheep/cluster/accord.c
index 1fdca91..fdce199 100644
--- a/sheep/cluster/accord.c
+++ b/sheep/cluster/accord.c
@@ -575,7 +575,7 @@ static int accord_dispatch(void)
 	switch (ev.type) {
 	case EVENT_JOIN:
 		if (ev.blocked) {
-			if (node_cmp(&ev.nodes[0], &this_node) == 0) {
+			if (node_eq(&ev.nodes[0], &this_node)) {
 				res = sd_check_join_cb(&ev.sender, ev.buf);
 				ev.join_result = res;
 				ev.blocked = 0;
diff --git a/sheep/cluster/local.c b/sheep/cluster/local.c
index fd84615..8d14004 100644
--- a/sheep/cluster/local.c
+++ b/sheep/cluster/local.c
@@ -403,7 +403,7 @@ static int local_dispatch(void)
 	switch (ev->type) {
 	case EVENT_JOIN:
 		if (ev->blocked) {
-			if (node_cmp(&ev->nodes[0], &this_node) == 0) {
+			if (node_eq(&ev->nodes[0], &this_node)) {
 				res = sd_check_join_cb(&ev->sender, ev->buf);
 				ev->join_result = res;
 				ev->blocked = 0;
@@ -438,7 +438,7 @@ static int local_dispatch(void)
 		break;
 	case EVENT_NOTIFY:
 		if (ev->blocked) {
-			if (node_cmp(&ev->sender, &this_node) == 0) {
+			if (node_eq(&ev->sender, &this_node)) {
 				if (!ev->callbacked) {
 					queue_work(local_block_wq, &work);
 
diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 491056a..b6856be 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -267,7 +267,9 @@ static int zk_queue_pop(zhandle_t *zh, struct zk_event *ev)
 		len = sizeof(*ev);
 		sprintf(path, QUEUE_ZNODE "/%010d", queue_pos);
 		rc = zk_get(zh, path, 1, (char *)ev, &len, NULL);
-		if (rc == ZOK && node_cmp(&ev->sender.node, &lev->sender.node) == 0 && ev->blocked) {
+		if (rc == ZOK
+				&& node_eq(&ev->sender.node, &lev->sender.node)
+				&& ev->blocked) {
 			dprintf("this queue_pos:%010d have blocked whole cluster, ignore it\n", queue_pos);
 			queue_pos++;
 
@@ -446,7 +448,7 @@ static int is_master(zhandle_t *zh, struct zk_node *znode)
 	}
 
 	twalk(zk_node_btroot, node_btree_find_master_fn);
-	if (node_cmp(&zk_master->node, &znode->node) == 0)
+	if (node_eq(&zk_master->node, &znode->node))
 		return 1;
 
 	return 0;
@@ -795,7 +797,7 @@ static int zk_dispatch(void)
 
 			goto out;
 		} else if (is_master(zhandle, &this_node)
-			&& node_cmp(&ev.sender.node, &this_node.node) != 0) {
+			&& !node_eq(&ev.sender.node, &this_node.node)) {
 			/* wait util member have been created */
 			sprintf(path, MEMBER_ZNODE "/%s", node_to_str(&ev.sender.node));
 			retry = MEMBER_CREATE_TIMEOUT/MEMBER_CREATE_INTERVAL;
@@ -810,7 +812,7 @@ static int zk_dispatch(void)
 			}
 		}
 
-		if (node_cmp(&ev.sender.node, &this_node.node) == 0)
+		if (node_eq(&ev.sender.node, &this_node.node))
 			zk_member_init(zhandle);
 
 		if (ev.join_result == CJ_RES_MASTER_TRANSFER) {
@@ -829,7 +831,7 @@ static int zk_dispatch(void)
 
 		if (ev.join_result == CJ_RES_SUCCESS) {
 			sprintf(path, MEMBER_ZNODE "/%s", node_to_str(&ev.sender.node));
-			if (node_cmp(&ev.sender.node, &this_node.node) == 0) {
+			if (node_eq(&ev.sender.node, &this_node.node)) {
 				dprintf("create path:%s\n", path);
 				rc = zk_create(zhandle, path, (char *)&ev.sender, sizeof(ev.sender),
 					&ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, NULL, 0);
@@ -862,7 +864,8 @@ static int zk_dispatch(void)
 	case EVENT_NOTIFY:
 		dprintf("NOTIFY, blocked:%d\n", ev.blocked);
 		if (ev.blocked) {
-			if (node_cmp(&ev.sender.node, &this_node.node) == 0 && !ev.callbacked) {
+			if (node_eq(&ev.sender.node, &this_node.node)
+					&& !ev.callbacked) {
 				ev.callbacked = 1;
 
 				uatomic_inc(&zk_notify_blocked);
diff --git a/sheep/group.c b/sheep/group.c
index 73a5ba7..ec2139a 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -305,7 +305,7 @@ static struct sd_node *find_entry_list(struct sd_node *entry,
 {
 	struct node *n;
 	list_for_each_entry(n, head, list)
-		if (node_cmp(&n->ent, entry) == 0)
+		if (node_eq(&n->ent, entry))
 			return entry;
 
 	return NULL;
@@ -321,7 +321,7 @@ static struct sd_node *find_entry_epoch(struct sd_node *entry,
 	nr = epoch_log_read_nr(epoch, (char *)nodes, sizeof(nodes));
 
 	for (i = 0; i < nr; i++)
-		if (node_cmp(&nodes[i], entry) == 0)
+		if (node_eq(&nodes[i], entry))
 			return entry;
 
 	return NULL;
@@ -420,10 +420,10 @@ static int get_cluster_status(struct sd_node *from,
 		}
 
 		for (i = 0; i < nr_local_entries; i++) {
-			if (node_cmp(local_entries + i, from) == 0)
+			if (node_eq(local_entries + i, from))
 				goto next;
 			for (j = 0; j < sys->nr_nodes; j++) {
-				if (node_cmp(local_entries + i, sys->nodes + j) == 0)
+				if (node_eq(local_entries + i, sys->nodes + j))
 					goto next;
 			}
 			break;
@@ -531,7 +531,7 @@ static void finish_join(struct join_message *msg, struct sd_node *joined,
 
 	/* add nodes execept for newly joined one */
 	for (i = 0; i < nr_nodes; i++) {
-		if (node_cmp(nodes + i, joined) == 0)
+		if (node_eq(nodes + i, joined))
 			continue;
 
 		sys->nodes[sys->nr_nodes++] = nodes[i];
@@ -748,7 +748,7 @@ enum cluster_join_result sd_check_join_cb(struct sd_node *joining, void *opaque)
 	struct join_message *jm = opaque;
 	struct node *node;
 
-	if (node_cmp(joining, &sys->this_node) == 0) {
+	if (node_eq(joining, &sys->this_node)) {
 		struct sd_node entries[SD_MAX_NODES];
 		int nr_entries;
 		uint64_t ctime;
@@ -853,7 +853,7 @@ static void __sd_join_done(struct event_struct *cevent)
 			sys_stat_set(SD_STATUS_OK);
 	}
 
-	if (node_cmp(&w->joined, &sys->this_node) == 0)
+	if (node_eq(&w->joined, &sys->this_node))
 		/* this output is used for testing */
 		vprintf(SDOG_DEBUG, "join Sheepdog cluster\n");
 }
@@ -1111,7 +1111,7 @@ void sd_join_handler(struct sd_node *joined, struct sd_node *members,
 	struct join_message *jm;
 	uint32_t le = get_latest_epoch();
 
-	if (node_cmp(joined, &sys->this_node) == 0) {
+	if (node_eq(joined, &sys->this_node)) {
 		if (result == CJ_RES_FAIL) {
 			eprintf("Fail to join. The joining node has an invalid epoch.\n");
 			sys->cdrv->leave();
@@ -1230,7 +1230,7 @@ void sd_join_handler(struct sd_node *joined, struct sd_node *members,
 			update_epoch_store(sys->epoch);
 		}
 
-		if (node_cmp(joined, &sys->this_node) == 0)
+		if (node_eq(joined, &sys->this_node))
 			/* this output is used for testing */
 			vprintf(SDOG_DEBUG, "join Sheepdog cluster\n");
 		break;
-- 
1.7.5.4






More information about the sheepdog mailing list