[Ocfs2-tools-commits] jlbec commits r1402 - in branches/cman-based: libo2cb libo2cb/include ocfs2_controld

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed Aug 22 19:22:41 PDT 2007


Author: jlbec
Date: 2007-08-22 19:22:39 -0700 (Wed, 22 Aug 2007)
New Revision: 1402

Modified:
   branches/cman-based/libo2cb/include/o2cb.h
   branches/cman-based/libo2cb/include/o2cb_abi.h
   branches/cman-based/libo2cb/o2cb_abi.c
   branches/cman-based/ocfs2_controld/action.c
Log:

Create the functions o2cb_user_heartbeat_node_up/down().  These are o2cb
API to symlink user heartbeat regions to nodes that are up or down.

Change ocfs2_controld to use the new API rather than building symlinks
by hand.  ocfs2_controld no longer hand-builds o2cb paths!



Modified: branches/cman-based/libo2cb/include/o2cb.h
===================================================================
--- branches/cman-based/libo2cb/include/o2cb.h	2007-08-23 01:48:48 UTC (rev 1401)
+++ branches/cman-based/libo2cb/include/o2cb.h	2007-08-23 02:22:39 UTC (rev 1402)
@@ -109,6 +109,12 @@
 				       struct o2cb_region_desc *desc);
 errcode_t o2cb_remove_heartbeat_region(const char *cluster_name,
 				       struct o2cb_region_desc *desc);
+errcode_t o2cb_user_heartbeat_node_down(const char *cluster_name,
+					const char *region_name,
+					const char *node_name);
+errcode_t o2cb_user_heartbeat_node_up(const char *cluster_name,
+				      const char *region_name,
+				      const char *node_name);
 errcode_t o2cb_get_region_ref(const char *region_name, int undo);
 errcode_t o2cb_put_region_ref(const char *region_name, int undo);
 errcode_t o2cb_num_region_refs(const char *region_name, int *num_refs);

Modified: branches/cman-based/libo2cb/include/o2cb_abi.h
===================================================================
--- branches/cman-based/libo2cb/include/o2cb_abi.h	2007-08-23 01:48:48 UTC (rev 1401)
+++ branches/cman-based/libo2cb/include/o2cb_abi.h	2007-08-23 02:22:39 UTC (rev 1402)
@@ -39,5 +39,6 @@
 #define O2CB_FORMAT_HEARTBEAT_DIR	O2CB_FORMAT_CLUSTER "/heartbeat"
 #define O2CB_FORMAT_HEARTBEAT_REGION	O2CB_FORMAT_HEARTBEAT_DIR "/%s"
 #define O2CB_FORMAT_HEARTBEAT_REGION_ATTR	O2CB_FORMAT_HEARTBEAT_REGION "/%s"
+#define O2CB_FORMAT_USER_HEARTBEAT_NODE	O2CB_FORMAT_HEARTBEAT_REGION "/%s"
 
 #endif  /* _O2CB_ABI_H */

Modified: branches/cman-based/libo2cb/o2cb_abi.c
===================================================================
--- branches/cman-based/libo2cb/o2cb_abi.c	2007-08-23 01:48:48 UTC (rev 1401)
+++ branches/cman-based/libo2cb/o2cb_abi.c	2007-08-23 02:22:39 UTC (rev 1402)
@@ -712,6 +712,144 @@
 	return 0;
 }
 
+errcode_t o2cb_user_heartbeat_node_up(const char *cluster_name,
+				      const char *region_name,
+				      const char *node_name)
+{
+	int rc;
+	errcode_t err = 0;
+	char link_path[PATH_MAX];
+	char target_path[PATH_MAX];
+
+	if (current_stack == O2CB_STACK_NONE) {
+		err = O2CB_ET_SERVICE_UNAVAILABLE;
+		goto out;
+	}
+
+	if (current_stack == O2CB_STACK_O2CB) {
+	       err = O2CB_ET_CONFIGURATION_ERROR;
+	       goto out;
+	}
+
+	rc = snprintf(link_path, PATH_MAX, O2CB_FORMAT_USER_HEARTBEAT_NODE,
+		      configfs_path, cluster_name, region_name, node_name);
+	if (rc <= 0 || rc == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	rc = snprintf(target_path, PATH_MAX, O2CB_FORMAT_NODE,
+		      configfs_path, cluster_name, node_name);
+	if (rc <= 0 || rc == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	/*
+	 * We don't need to check that target_path exists.  Configfs
+	 * will do it for us.
+	 */
+	rc = symlink(target_path, link_path);
+	if (rc) {
+		switch (errno) {
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			case ENOMEM:
+				err = O2CB_ET_NO_MEMORY;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case EEXIST:
+				err = O2CB_ET_NODE_EXISTS;
+				break;
+
+			case EBUSY:
+				err = O2CB_ET_REGION_IN_USE;
+				break;
+
+			default:
+				/*
+				 * This includes EISDIR, which the
+				 * kernel driver shouldn't allow.
+				 */
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+		}
+	}
+
+out:
+	return err;
+}
+
+errcode_t o2cb_user_heartbeat_node_down(const char *cluster_name,
+					const char *region_name,
+					const char *node_name)
+{
+	int rc;
+	errcode_t err = 0;
+	char link_path[PATH_MAX];
+
+	if (current_stack == O2CB_STACK_NONE) {
+		err = O2CB_ET_SERVICE_UNAVAILABLE;
+		goto out;
+	}
+
+	if (current_stack == O2CB_STACK_O2CB) {
+	       err = O2CB_ET_CONFIGURATION_ERROR;
+	       goto out;
+	}
+
+	rc = snprintf(link_path, PATH_MAX, O2CB_FORMAT_USER_HEARTBEAT_NODE,
+		      configfs_path, cluster_name, region_name, node_name);
+	if (rc <= 0 || rc == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	rc = unlink(link_path);
+	if (rc) {
+		switch (errno) {
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			case ENOMEM:
+				err = O2CB_ET_NO_MEMORY;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case EBUSY:
+				err = O2CB_ET_REGION_IN_USE;
+				break;
+
+			default:
+				/*
+				 * This includes EISDIR, which the
+				 * kernel driver shouldn't allow.
+				 */
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+		}
+	}
+
+out:
+	return err;
+}
+
 errcode_t o2cb_create_heartbeat_region(const char *cluster_name,
 				       struct o2cb_region_desc *desc)
 {

Modified: branches/cman-based/ocfs2_controld/action.c
===================================================================
--- branches/cman-based/ocfs2_controld/action.c	2007-08-23 01:48:48 UTC (rev 1401)
+++ branches/cman-based/ocfs2_controld/action.c	2007-08-23 02:22:39 UTC (rev 1402)
@@ -570,12 +570,9 @@
 	return NULL;
 }
 
-#define MEMBER_LINK_FORMAT	"/sys/kernel/config/cluster/%s/heartbeat/%s/%s"
-#define MEMBER_TARGET_FORMAT	"/sys/kernel/config/cluster/%s/node/%s"
 static int drop_member(struct mountgroup *mg, struct mg_member *memb)
 {
-	int rc;
-	char link[PATH_MAX+1];
+	errcode_t err;
 
 	/* 
 	 * XXX Can we just remove here, or should we wait until
@@ -587,24 +584,24 @@
 	memb->gone_type = mg->start_type;
 	mg->memb_count--;
 
-	snprintf(link, PATH_MAX, MEMBER_LINK_FORMAT, clustername, mg->uuid,
-		 memb->name);
-	rc = unlink(link);
-	if (rc)
-		log_error("unlink of %s failed: %d", link, errno);
+	err = o2cb_user_heartbeat_node_down(clustername, mg->uuid,
+					    memb->name);
+	if (err)
+		log_error("%s while removing node %s from region %s",
+			  error_message(err), memb->name, mg->uuid);
 
 	free(memb);
 
-	return rc;
+	return err;
 }
 
 static int add_member(struct mountgroup *mg, int nodeid)
 {
-	int rc;
+	int rc = 0;
+	errcode_t err;
 	struct list_head *p;
 	char *node_name;
 	struct mg_member *memb, *test, *target = NULL;
-	char link[PATH_MAX+1], nodepath[PATH_MAX+1];
 
 	memb = malloc(sizeof(struct mg_member));
 	if (!memb) {
@@ -632,17 +629,15 @@
 		}
 	}
 
-	snprintf(link, PATH_MAX, MEMBER_LINK_FORMAT, clustername, mg->uuid,
-		 memb->name);
-	snprintf(nodepath, PATH_MAX, MEMBER_TARGET_FORMAT, clustername,
-		 memb->name);
+	log_group(mg, "Adding heartbeat link for node %s in region %s",
+		  memb->name, mg->uuid);
 
-	log_group(mg, "Adding heartbeat link %s -> %s", link, nodepath);
-	rc = symlink(nodepath, link);
-	if (rc) {
-		rc = -errno;
-		log_error("Unable to create heartbeat link %s -> %s", link,
-			  nodepath);
+	err = o2cb_user_heartbeat_node_up(clustername, mg->uuid,
+					  memb->name);
+	if (err) {
+		rc = -EIO;
+		log_error("%s while creating heartbeat link for node %s in region %s",
+			  error_message(err), memb->name, mg->uuid);
 		goto out_free;
 	}
 




More information about the Ocfs2-tools-commits mailing list