[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