[sheepdog] [PATCH 1/2] sheep: split getting the local address from cluster driver ->init

Christoph Hellwig hch at infradead.org
Wed Jun 6 14:38:59 CEST 2012


Getting a suitable address to advertise to other sheep is substancially
different functionality from initializing the cluster driver.  Split it
into a separate optional method that falls back to the getifaddrs loop
if not specified.

Signed-off-by: Christoph Hellwig <hch at lst.de>

diff --git a/sheep/cluster.h b/sheep/cluster.h
index 07e5f7b..c5dcedf 100644
--- a/sheep/cluster.h
+++ b/sheep/cluster.h
@@ -41,11 +41,19 @@ struct cluster_driver {
 	/*
 	 * Initialize the cluster driver
 	 *
-	 * On success, this function returns the file descriptor that
-	 * may be used with the poll(2) to monitor cluster events.  On
-	 * error, returns -1.
+	 * Returns zero on success, -1 on error.
 	 */
-	int (*init)(const char *option, uint8_t *myaddr);
+	int (*init)(const char *option);
+
+	/*
+	 * Get a node ID for this sheep.
+	 *
+	 * Gets and ID that is used in all communication with other sheep,
+	 * which normally would be a string formatted IP address.
+	 *
+	 * Returns zero on success, -1 on error.
+	 */
+	int (*get_local_addr)(uint8_t *myaddr);
 
 	/*
 	 * Join the cluster
diff --git a/sheep/cluster/accord.c b/sheep/cluster/accord.c
index c3e0320..5fdad5f 100644
--- a/sheep/cluster/accord.c
+++ b/sheep/cluster/accord.c
@@ -528,7 +528,7 @@ out:
 	pthread_mutex_unlock(&queue_lock);
 }
 
-static int accord_init(const char *option, uint8_t *myaddr)
+static int accord_init(const char *option)
 {
 	int ret;
 
@@ -546,9 +546,6 @@ static int accord_init(const char *option, uint8_t *myaddr)
 		return -1;
 	}
 
-	if (get_local_addr(myaddr) < 0)
-		return -1;
-
 	efd = eventfd(0, EFD_NONBLOCK);
 	if (efd < 0) {
 		eprintf("failed to create an event fd: %m\n");
diff --git a/sheep/cluster/corosync.c b/sheep/cluster/corosync.c
index e6655a0..f477b51 100644
--- a/sheep/cluster/corosync.c
+++ b/sheep/cluster/corosync.c
@@ -121,7 +121,7 @@ static inline void del_cpg_node(struct cpg_node *nodes, size_t nr_nodes,
 	memmove(nodes + idx, nodes + idx + 1, sizeof(*nodes) * (nr_nodes - idx));
 }
 
-static int nodeid_to_addr(uint32_t nodeid, uint8_t *addr)
+static int corosync_get_local_addr(uint8_t *addr)
 {
 	int ret, nr;
 	corosync_cfg_node_address_t caddr;
@@ -130,7 +130,8 @@ static int nodeid_to_addr(uint32_t nodeid, uint8_t *addr)
 	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)caddr.address;
 	void *saddr;
 
-	ret = corosync_cfg_get_node_addrs(cfg_handle, nodeid, 1, &nr, &caddr);
+	ret = corosync_cfg_get_node_addrs(cfg_handle, this_node.nodeid, 1,
+					  &nr, &caddr);
 	if (ret != CS_OK) {
 		vprintf(SDOG_ERR, "failed to get node addresses (%d)\n", ret);
 		return -1;
@@ -679,7 +680,7 @@ out:
 	exit(1);
 }
 
-static int corosync_init(const char *option, uint8_t *myaddr)
+static int corosync_init(const char *option)
 {
 	int ret, fd;
 	uint32_t nodeid;
@@ -707,12 +708,6 @@ static int corosync_init(const char *option, uint8_t *myaddr)
 		return -1;
 	}
 
-	ret = nodeid_to_addr(nodeid, myaddr);
-	if (ret < 0) {
-		eprintf("failed to get local address\n");
-		return -1;
-	}
-
 	this_node.nodeid = nodeid;
 	this_node.pid = getpid();
 
@@ -733,14 +728,15 @@ static int corosync_init(const char *option, uint8_t *myaddr)
 }
 
 struct cluster_driver cdrv_corosync = {
-	.name       = "corosync",
-
-	.init       = corosync_init,
-	.join       = corosync_join,
-	.leave      = corosync_leave,
-	.notify     = corosync_notify,
-	.block      = corosync_block,
-	.unblock    = corosync_unblock,
+	.name		= "corosync",
+
+	.init		= corosync_init,
+	.get_local_addr	= corosync_get_local_addr,
+	.join		= corosync_join,
+	.leave		= corosync_leave,
+	.notify		= corosync_notify,
+	.block		= corosync_block,
+	.unblock	= corosync_unblock,
 };
 
 cdrv_register(cdrv_corosync);
diff --git a/sheep/cluster/local.c b/sheep/cluster/local.c
index 4f2d8e8..d60f26b 100644
--- a/sheep/cluster/local.c
+++ b/sheep/cluster/local.c
@@ -420,7 +420,16 @@ out:
 	shm_queue_unlock();
 }
 
-static int local_init(const char *option, uint8_t *myaddr)
+static int local_get_local_addr(uint8_t *myaddr)
+{
+	/* set 127.0.0.1 */
+	memset(myaddr, 0, 16);
+	myaddr[12] = 127;
+	myaddr[15] = 1;
+	return 0;
+}
+
+static int local_init(const char *option)
 {
 	sigset_t mask;
 	int ret;
@@ -432,11 +441,6 @@ static int local_init(const char *option, uint8_t *myaddr)
 	if (option)
 		shmfile = option;
 
-	/* set 127.0.0.1 */
-	memset(myaddr, 0, 16);
-	myaddr[12] = 127;
-	myaddr[15] = 1;
-
 	shm_queue_init();
 
 	sigemptyset(&mask);
@@ -461,14 +465,15 @@ static int local_init(const char *option, uint8_t *myaddr)
 }
 
 struct cluster_driver cdrv_local = {
-	.name       = "local",
-
-	.init       = local_init,
-	.join       = local_join,
-	.leave      = local_leave,
-	.notify     = local_notify,
-	.block      = local_block,
-	.unblock    = local_unblock,
+	.name		= "local",
+
+	.init		= local_init,
+	.get_local_addr	= local_get_local_addr,
+	.join		= local_join,
+	.leave		= local_leave,
+	.notify		= local_notify,
+	.block		= local_block,
+	.unblock	= local_unblock,
 };
 
 cdrv_register(cdrv_local);
diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 8499cb4..273b34d 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -786,7 +786,7 @@ out:
 	return;
 }
 
-static int zk_init(const char *option, uint8_t *myaddr)
+static int zk_init(const char *option)
 {
 	int ret;
 
@@ -807,9 +807,6 @@ static int zk_init(const char *option, uint8_t *myaddr)
 		"negotiated session timeout:%dms\n",
 		SESSION_TIMEOUT, zoo_recv_timeout(zhandle));
 
-	if (get_local_addr(myaddr) < 0)
-		return -1;
-
 	zk_queue_init(zhandle);
 
 	efd = eventfd(0, EFD_NONBLOCK);
diff --git a/sheep/group.c b/sheep/group.c
index ebfa12e..71c64ca 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -1046,7 +1046,14 @@ int create_cluster(int port, int64_t zone, int nr_vnodes)
 		}
 	}
 
-	ret = sys->cdrv->init(sys->cdrv_option, sys->this_node.addr);
+	ret = sys->cdrv->init(sys->cdrv_option);
+	if (ret < 0)
+		return -1;
+	
+	if (sys->cdrv->get_local_addr)
+		ret = sys->cdrv->get_local_addr(sys->this_node.addr);
+	else
+		ret = get_local_addr(sys->this_node.addr);
 	if (ret < 0)
 		return -1;
 



More information about the sheepdog mailing list