[Ocfs2-tools-commits] jlbec commits r1394 - in branches/cman-based: libo2cb libo2cb/include mount.ocfs2 vendor/common

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Fri Aug 17 15:40:54 PDT 2007


Author: jlbec
Date: 2007-08-17 15:40:52 -0700 (Fri, 17 Aug 2007)
New Revision: 1394

Modified:
   branches/cman-based/libo2cb/include/o2cb.h
   branches/cman-based/libo2cb/o2cb_abi.c
   branches/cman-based/mount.ocfs2/mount.ocfs2.c
   branches/cman-based/vendor/common/o2cb.init.sh
Log:

Create operation structures for each known cluster stack.  This allows
each one to handle begin_group_join/complete_group_join/group_leave as
appropriate.

o2cb_init() will now fail if STACKCONF (usually /var/run/o2cb.stack) isn't
set.  o2cb.init sets it.  This is how libo2cb determines which stack to
communicate with.

While we're at it, fix a bug with o2cb.init where it creates STACKCONF too
late.

Move the "o2cb" stack operations to static functions, adding them to the
"classic_stack" operation structure.

Finally, have the external APIs merely fill in the default cluster name
and call the stack operations.



Modified: branches/cman-based/libo2cb/include/o2cb.h
===================================================================
--- branches/cman-based/libo2cb/include/o2cb.h	2007-08-17 21:27:31 UTC (rev 1393)
+++ branches/cman-based/libo2cb/include/o2cb.h	2007-08-17 22:40:52 UTC (rev 1394)
@@ -63,8 +63,19 @@
 
 #define OCFS2_FS_NAME		"ocfs2"
 
+enum o2cb_known_stacks {
+	O2CB_STACK_NONE = 0,
+	O2CB_STACK_O2CB,
+	O2CB_STACK_HEARTBEAT2,
+#ifdef HAVE_CMAN
+	O2CB_STACK_CMAN,
+#endif
+};
+
 errcode_t o2cb_init(void);
 
+errcode_t o2cb_get_stack(enum o2cb_known_stacks *stack);
+errcode_t o2cb_get_stack_name(const char **name);
 errcode_t o2cb_create_cluster(const char *cluster_name);
 errcode_t o2cb_remove_cluster(const char *cluster_name);
 

Modified: branches/cman-based/libo2cb/o2cb_abi.c
===================================================================
--- branches/cman-based/libo2cb/o2cb_abi.c	2007-08-17 21:27:31 UTC (rev 1393)
+++ branches/cman-based/libo2cb/o2cb_abi.c	2007-08-17 22:40:52 UTC (rev 1394)
@@ -47,8 +47,164 @@
 #include "o2cb_crc32.h"
 #include "ocfs2_nodemanager.h"
 
+#ifdef HAVE_CMAN
+# include "o2cb_client_proto.h"
+# define STACKCONF	"/var/run/o2cb.stack"
+#endif
+
+struct o2cb_group_ops {
+	errcode_t (*begin_group_join)(const char *cluster_name,
+				      struct o2cb_region_desc *desc);
+	errcode_t (*complete_group_join)(const char *cluster_name,
+					 struct o2cb_region_desc *desc,
+					 int error);
+	errcode_t (*group_leave)(const char *cluster_name,
+				 struct o2cb_region_desc *desc);
+};
+
+struct o2cb_stack {
+	char *s_name;
+	struct o2cb_group_ops *s_ops;
+};
+
+static struct o2cb_stack none_stack = {
+	.s_name 	= "none",
+	.s_ops		= NULL,
+};
+
+static errcode_t classic_begin_group_join(const char *cluster_name,
+					  struct o2cb_region_desc *desc);
+static errcode_t classic_complete_group_join(const char *cluster_name,
+					     struct o2cb_region_desc *desc,
+					     int error);
+static errcode_t classic_group_leave(const char *cluster_name,
+				     struct o2cb_region_desc *desc);
+static struct o2cb_group_ops classic_ops = {
+	.begin_group_join	= classic_begin_group_join,
+	.complete_group_join	= classic_complete_group_join,
+	.group_leave		= classic_group_leave,
+};
+static struct o2cb_stack classic_stack = {
+	.s_name 	= "o2cb",
+	.s_ops		= &classic_ops,
+};
+
+static errcode_t heartbeat2_begin_group_join(const char *cluster_name,
+					     struct o2cb_region_desc *desc);
+static errcode_t heartbeat2_complete_group_join(const char *cluster_name,
+						struct o2cb_region_desc *desc,
+						int error);
+static errcode_t heartbeat2_group_leave(const char *cluster_name,
+					struct o2cb_region_desc *desc);
+static struct o2cb_group_ops heartbeat2_ops = {
+	.begin_group_join	= heartbeat2_begin_group_join,
+	.complete_group_join	= heartbeat2_complete_group_join,
+	.group_leave		= heartbeat2_group_leave,
+};
+static struct o2cb_stack heartbeat2_stack = {
+	.s_name 	= "heartbeat2",
+	.s_ops		= &heartbeat2_ops,
+};
+
+#ifdef HAVE_CMAN
+static errcode_t cman_begin_group_join(const char *cluster_name,
+				       struct o2cb_region_desc *desc);
+static errcode_t cman_complete_group_join(const char *cluster_name,
+					  struct o2cb_region_desc *desc,
+					  int error);
+static errcode_t cman_group_leave(const char *cluster_name,
+				  struct o2cb_region_desc *desc);
+static struct o2cb_group_ops cman_ops = {
+	.begin_group_join	= cman_begin_group_join,
+	.complete_group_join	= cman_complete_group_join,
+	.group_leave		= cman_group_leave,
+};
+static struct o2cb_stack cman_stack = {
+	.s_name 	= "cman",
+	.s_ops		= &cman_ops,
+};
+#endif  /* HAVE_CMAN */
+
+static struct o2cb_stack *o2cb_stacks[] = {
+	[O2CB_STACK_NONE]	= &none_stack,
+	[O2CB_STACK_O2CB]	= &classic_stack,
+	[O2CB_STACK_HEARTBEAT2]	= &heartbeat2_stack,
+#ifdef HAVE_CMAN
+	[O2CB_STACK_CMAN]	= &cman_stack,
+#endif
+};
+static int o2cb_stacks_len =
+	sizeof(o2cb_stacks) / sizeof(o2cb_stacks[0]);
+static enum o2cb_known_stacks current_stack = O2CB_STACK_NONE;
+
 static char *configfs_path;
 
+
+static errcode_t determine_stack(void)
+{
+	FILE *f;
+	char line[100];
+	int i;
+	size_t len;
+	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
+
+	f = fopen(STACKCONF, "r");
+	if (!f)
+		goto out;
+
+	if (!fgets(line, sizeof(line), f))
+		goto out_close;
+
+	len = strlen(line);
+	if (line[len - 1] == '\n') {
+		line[len - 1] = '\0';
+		len--;
+	}
+
+	for (i = 0; i < o2cb_stacks_len; i++) {
+		if (!strcmp(line, o2cb_stacks[i]->s_name)) {
+			current_stack = i;
+			err = 0;
+			break;
+		}
+	}
+	
+	/* If some joker put 'none' in STACKCONF, it's a failure */
+	if (!err && (current_stack == O2CB_STACK_NONE))
+		err = O2CB_ET_INTERNAL_FAILURE;
+
+out_close:
+	fclose(f);
+
+out:
+	return err;
+}
+
+errcode_t o2cb_get_stack(enum o2cb_known_stacks *stack)
+{
+	errcode_t err = 0;
+
+	if (current_stack == O2CB_STACK_NONE)
+		err = O2CB_ET_SERVICE_UNAVAILABLE;
+	else
+		*stack = current_stack;
+
+	return err;
+}
+
+errcode_t o2cb_get_stack_name(const char **name)
+{
+	errcode_t err;
+	enum o2cb_known_stacks stack;
+
+	err = o2cb_get_stack(&stack);
+	if (!err)
+		*name = o2cb_stacks[stack]->s_name;
+
+	return err;
+}
+
+
 errcode_t o2cb_create_cluster(const char *cluster_name)
 {
 	char path[PATH_MAX];
@@ -493,6 +649,10 @@
 	errcode_t err;
 	char revision_string[16];
 
+	err = determine_stack();
+	if (err)
+		return err;
+
 	err = try_file(O2CB_INTERFACE_REVISION_PATH, &fd);
 	if (err == O2CB_ET_SERVICE_UNAVAILABLE)
 		err = try_file(O2CB_INTERFACE_REVISION_PATH_OLD, &fd);
@@ -996,8 +1156,8 @@
  * to drop the reference taken during startup, otherwise that
  * reference was dropped automatically at process shutdown so there's
  * no need to drop one here. */
-errcode_t o2cb_group_leave(const char *cluster_name,
-			   struct o2cb_region_desc *desc)
+static errcode_t classic_group_leave(const char *cluster_name,
+				     struct o2cb_region_desc *desc)
 {
 	errcode_t ret, up_ret;
 	int hb_refs;
@@ -1047,8 +1207,8 @@
 	return ret;
 }
 
-errcode_t o2cb_begin_group_join(const char *cluster_name,
-				struct o2cb_region_desc *desc)
+static errcode_t classic_begin_group_join(const char *cluster_name,
+					  struct o2cb_region_desc *desc)
 {
 	errcode_t ret, up_ret;
 	int semid;
@@ -1076,9 +1236,9 @@
 	return ret;
 }
 
-errcode_t o2cb_complete_group_join(const char *cluster_name,
-				   struct o2cb_region_desc *desc,
-				   int error)
+static errcode_t classic_complete_group_join(const char *cluster_name,
+					     struct o2cb_region_desc *desc,
+					     int error)
 {
 	errcode_t ret = 0;
 
@@ -1088,6 +1248,110 @@
 	return ret;
 }
 
+static errcode_t heartbeat2_begin_group_join(const char *cluster_name,
+					     struct o2cb_region_desc *desc)
+{
+	return 0;
+}
+static errcode_t heartbeat2_complete_group_join(const char *cluster_name,
+						struct o2cb_region_desc *desc,
+						int error)
+{
+	return 0;
+}
+static errcode_t heartbeat2_group_leave(const char *cluster_name,
+					struct o2cb_region_desc *desc)
+{
+	return 0;
+}
+
+#ifdef HAVE_CMAN
+static errcode_t cman_begin_group_join(const char *cluster_name,
+				       struct o2cb_region_desc *desc)
+{
+	return 0;
+}
+static errcode_t cman_complete_group_join(const char *cluster_name,
+					  struct o2cb_region_desc *desc,
+					  int error)
+{
+	return 0;
+}
+static errcode_t cman_group_leave(const char *cluster_name,
+				  struct o2cb_region_desc *desc)
+{
+	return 0;
+}
+#endif
+
+errcode_t o2cb_begin_group_join(const char *cluster_name,
+				struct o2cb_region_desc *desc)
+{
+	errcode_t err;
+	char _fake_cluster_name[NAME_MAX];
+	struct o2cb_group_ops *ops;
+
+	if (current_stack == O2CB_STACK_NONE)
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+	else
+		ops = o2cb_stacks[current_stack]->s_ops;
+
+	if (!cluster_name) {
+		err = _fake_default_cluster(_fake_cluster_name);
+		if (err)
+			return err;
+		cluster_name = _fake_cluster_name;
+	}
+
+	return ops->begin_group_join(cluster_name, desc);
+}
+
+errcode_t o2cb_complete_group_join(const char *cluster_name,
+				   struct o2cb_region_desc *desc,
+				   int error)
+{
+	errcode_t err;
+	char _fake_cluster_name[NAME_MAX];
+	struct o2cb_group_ops *ops;
+
+	if (current_stack == O2CB_STACK_NONE)
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+	else
+		ops = o2cb_stacks[current_stack]->s_ops;
+
+	if (!cluster_name) {
+		err = _fake_default_cluster(_fake_cluster_name);
+		if (err)
+			return err;
+		cluster_name = _fake_cluster_name;
+	}
+
+	return ops->complete_group_join(cluster_name, desc, error);
+}
+
+errcode_t o2cb_group_leave(const char *cluster_name,
+			   struct o2cb_region_desc *desc)
+{
+	errcode_t err;
+	char _fake_cluster_name[NAME_MAX];
+	struct o2cb_group_ops *ops;
+
+	if (current_stack == O2CB_STACK_NONE)
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+	else
+		ops = o2cb_stacks[current_stack]->s_ops;
+
+	if (!cluster_name) {
+		err = _fake_default_cluster(_fake_cluster_name);
+		if (err)
+			return err;
+		cluster_name = _fake_cluster_name;
+	}
+
+	return ops->group_leave(cluster_name, desc);
+}
+
+
 static inline int is_dots(const char *name)
 {
 	size_t len = strlen(name);

Modified: branches/cman-based/mount.ocfs2/mount.ocfs2.c
===================================================================
--- branches/cman-based/mount.ocfs2/mount.ocfs2.c	2007-08-17 21:27:31 UTC (rev 1393)
+++ branches/cman-based/mount.ocfs2/mount.ocfs2.c	2007-08-17 22:40:52 UTC (rev 1394)
@@ -303,7 +303,7 @@
 	if (clustered) {
 		ret = o2cb_init();
 		if (ret) {
-			com_err(progname, ret, "Cannot initialize cluster");
+			com_err(progname, ret, "while trying initialize cluster");
 			goto bail;
 		}
 

Modified: branches/cman-based/vendor/common/o2cb.init.sh
===================================================================
--- branches/cman-based/vendor/common/o2cb.init.sh	2007-08-17 21:27:31 UTC (rev 1393)
+++ branches/cman-based/vendor/common/o2cb.init.sh	2007-08-17 22:40:52 UTC (rev 1394)
@@ -1177,6 +1177,13 @@
         return
     fi
 
+    echo "$O2CB_STACK" >"$STACKCONF" 2>/dev/null
+    if [ "$?" != 0 ]
+    then
+        echo -n "Setting O2CB_STACK file: "
+        if_fail $? "Unable to store cluster stack information"
+    fi
+
     case "$O2CB_STACK" in
         o2cb|heartbeat2) online_o2cb "$CLUSTER" ;;
         cman)
@@ -1193,13 +1200,6 @@
             exit 1
             ;;
     esac
-
-    echo "$O2CB_STACK" >"$STACKCONF" 2>/dev/null
-    if [ "$?" != 0 ]
-    then
-        echo -n "Setting O2CB_STACK file: "
-        if_fail $? "Unable to store cluster stack information"
-    fi
 }
 
 #




More information about the Ocfs2-tools-commits mailing list