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

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Fri Aug 17 17:10:38 PDT 2007


Author: jlbec
Date: 2007-08-17 17:10:36 -0700 (Fri, 17 Aug 2007)
New Revision: 1395

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

Flesh out the cman group operations.  This uses the communication protocol
to talk to ocfs2_controld.

<docbrown>IT WORKS!</docbrown>

While we're here, fix a small cosmetic bug in "o2cb.init stop" and make
sure ocfs2_controld logs as ocfs2_controld, not gfs2_controld.



Modified: branches/cman-based/libo2cb/include/o2cb.h
===================================================================
--- branches/cman-based/libo2cb/include/o2cb.h	2007-08-17 22:40:52 UTC (rev 1394)
+++ branches/cman-based/libo2cb/include/o2cb.h	2007-08-18 00:10:36 UTC (rev 1395)
@@ -110,7 +110,7 @@
 				struct o2cb_region_desc *desc);
 errcode_t o2cb_complete_group_join(const char *cluster_name,
 				   struct o2cb_region_desc *desc,
-				   int error);
+				   int result);
 errcode_t o2cb_group_leave(const char *cluster_name,
 			   struct o2cb_region_desc *desc);
 

Modified: branches/cman-based/libo2cb/o2cb_abi.c
===================================================================
--- branches/cman-based/libo2cb/o2cb_abi.c	2007-08-17 22:40:52 UTC (rev 1394)
+++ branches/cman-based/libo2cb/o2cb_abi.c	2007-08-18 00:10:36 UTC (rev 1395)
@@ -5,21 +5,16 @@
  *
  * Kernel<->User ABI for modifying cluster configuration.
  *
- * Copyright (C) 2004 Oracle.  All rights reserved.
+ * Copyright (C) 2004,2007 Oracle.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
- * License, version 2,  as published by the Free Software Foundation.
+ * License, version 2, as published by the Free Software Foundation.
  * 
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA.
  */
 
 #define _XOPEN_SOURCE 600  /* Triggers XOPEN2K in features.h */
@@ -50,6 +45,7 @@
 #ifdef HAVE_CMAN
 # include "o2cb_client_proto.h"
 # define STACKCONF	"/var/run/o2cb.stack"
+static int controld_fd = -1;
 #endif
 
 struct o2cb_group_ops {
@@ -57,7 +53,7 @@
 				      struct o2cb_region_desc *desc);
 	errcode_t (*complete_group_join)(const char *cluster_name,
 					 struct o2cb_region_desc *desc,
-					 int error);
+					 int result);
 	errcode_t (*group_leave)(const char *cluster_name,
 				 struct o2cb_region_desc *desc);
 };
@@ -76,7 +72,7 @@
 					  struct o2cb_region_desc *desc);
 static errcode_t classic_complete_group_join(const char *cluster_name,
 					     struct o2cb_region_desc *desc,
-					     int error);
+					     int result);
 static errcode_t classic_group_leave(const char *cluster_name,
 				     struct o2cb_region_desc *desc);
 static struct o2cb_group_ops classic_ops = {
@@ -93,7 +89,7 @@
 					     struct o2cb_region_desc *desc);
 static errcode_t heartbeat2_complete_group_join(const char *cluster_name,
 						struct o2cb_region_desc *desc,
-						int error);
+						int result);
 static errcode_t heartbeat2_group_leave(const char *cluster_name,
 					struct o2cb_region_desc *desc);
 static struct o2cb_group_ops heartbeat2_ops = {
@@ -111,7 +107,7 @@
 				       struct o2cb_region_desc *desc);
 static errcode_t cman_complete_group_join(const char *cluster_name,
 					  struct o2cb_region_desc *desc,
-					  int error);
+					  int result);
 static errcode_t cman_group_leave(const char *cluster_name,
 				  struct o2cb_region_desc *desc);
 static struct o2cb_group_ops cman_ops = {
@@ -1238,49 +1234,334 @@
 
 static errcode_t classic_complete_group_join(const char *cluster_name,
 					     struct o2cb_region_desc *desc,
-					     int error)
+					     int result)
 {
 	errcode_t ret = 0;
 
-	if (error)
-		ret = o2cb_group_leave(cluster_name, desc);
+	if (result)
+		ret = classic_group_leave(cluster_name, desc);
 
 	return ret;
 }
 
+/*
+ * For ocfs2_hb_ctl reporting, we'll take the references just like
+ * the classic stack.
+ *
+ * XXX: This is something the heartbeat2 guys should comment on.
+ */
 static errcode_t heartbeat2_begin_group_join(const char *cluster_name,
 					     struct o2cb_region_desc *desc)
 {
-	return 0;
+	errcode_t ret, up_ret;
+	int semid;
+
+	ret = o2cb_mutex_down_lookup(desc->r_name, &semid);
+	if (ret)
+		return ret;
+
+	ret = __o2cb_get_ref(semid, !desc->r_persist);
+
+	up_ret = o2cb_mutex_up(semid);
+	if (up_ret && !ret)
+		ret = up_ret;
+
+	return ret;
 }
+
 static errcode_t heartbeat2_complete_group_join(const char *cluster_name,
 						struct o2cb_region_desc *desc,
-						int error)
+						int result)
 {
-	return 0;
+	errcode_t ret = 0;
+
+	if (result)
+		ret = heartbeat2_group_leave(cluster_name, desc);
+
+	return ret;
 }
+
 static errcode_t heartbeat2_group_leave(const char *cluster_name,
 					struct o2cb_region_desc *desc)
 {
-	return 0;
+	errcode_t ret, up_ret;
+	int hb_refs;
+	int semid;
+
+	ret = o2cb_mutex_down_lookup(desc->r_name, &semid);
+	if (ret)
+		return ret;
+
+	ret = __o2cb_get_num_refs(semid, &hb_refs);
+	if (ret)
+		goto up;
+
+	/* A previous process may have died and left us with no
+	 * references on the region. We avoid a negative error count
+	 * here and clean up the region as normal. */
+	if (hb_refs) {
+		ret = __o2cb_drop_ref(semid, !desc->r_persist);
+		if (ret)
+			goto up;
+
+		/* No need to call get_num_refs again -- this was
+		 * atomic so we know what the new value must be. */
+		hb_refs--;
+	}
+
+	if (!hb_refs) {
+		ret = o2cb_destroy_sem_set(semid);
+		if (!ret)
+			goto done;
+	}
+up:
+	up_ret = o2cb_mutex_up(semid);
+	if (up_ret && !ret) /* XXX: Maybe stop heartbeat here then? */
+		ret = up_ret;
+
+done:
+	return ret;
 }
 
 #ifdef HAVE_CMAN
+static int parse_status(char **args, int *error, char **error_msg)
+{
+	int rc = 0;
+	long err;
+	char *ptr = NULL;
+
+	err = strtol(args[0], &ptr, 10);
+	if (ptr && *ptr != '\0') {
+		/* fprintf(stderr, "Invalid error code string: %s", args[0]); */
+		rc = -EINVAL;
+	} else if ((err == LONG_MIN) || (err == LONG_MAX) ||
+		   (err < INT_MIN) || (err > INT_MAX)) {
+		/* fprintf(stderr, "Error code %ld out of range", err); */
+		rc = -ERANGE;
+	} else {
+		*error_msg = args[1];
+		*error = err;
+	}
+
+	return rc;
+}
+
 static errcode_t cman_begin_group_join(const char *cluster_name,
 				       struct o2cb_region_desc *desc)
 {
-	return 0;
+	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
+	int rc;
+	int error;
+	char *error_msg;
+	client_message message;
+	char *argv[OCFS2_CONTROLD_MAXARGS + 1];
+	char buf[OCFS2_CONTROLD_MAXLINE];
+
+	if (controld_fd != -1) {
+		/* fprintf(stderr, "Join already in progress!\n"); */
+		rc = -EINPROGRESS;
+		goto out;
+	}
+
+	rc = client_connect();
+	if (rc < 0) {
+		/* fprintf(stderr, "Unable to connect to ocfs2_controld: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+	controld_fd = rc;
+
+	rc = send_message(controld_fd, CM_MOUNT, OCFS2_FS_NAME,
+			  desc->r_name, cluster_name, desc->r_device_name,
+			  desc->r_service);
+	if (rc) {
+		/* fprintf(stderr, "Unable to send MOUNT message: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	rc = receive_message(controld_fd, buf, &message, argv);
+	if (rc < 0) {
+		/* fprintf(stderr, "Error reading from daemon: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	switch (message) {
+		case CM_STATUS:
+			rc = parse_status(argv, &error, &error_msg);
+			if (rc) {
+				/* fprintf(stderr, "Bad status message: %s\n",
+					strerror(-rc)); */
+				goto out;
+			}
+			if (error && (error != EALREADY)) {
+				/* fprintf(stderr,
+					"Error %d from daemon: %s\n",
+					error, error_msg); */
+				goto out;
+			}
+			break;
+
+		default:
+			/* fprintf(stderr,
+				"Unexpected message %s from daemon\n",
+				message_to_string(message)); */
+			goto out;
+			break;
+	}
+
+	err = 0;
+
+out:
+	if (err && (controld_fd != -1)) {
+		close(controld_fd);
+		controld_fd = -1;
+	}
+
+	return err;
 }
+
 static errcode_t cman_complete_group_join(const char *cluster_name,
 					  struct o2cb_region_desc *desc,
-					  int error)
+					  int result)
 {
-	return 0;
+	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
+	int rc;
+	int error;
+	char *error_msg;
+	client_message message;
+	char *argv[OCFS2_CONTROLD_MAXARGS + 1];
+	char buf[OCFS2_CONTROLD_MAXLINE];
+
+	if (controld_fd == -1) {
+		/* fprintf(stderr, "Join not started!\n"); */
+		rc = -EINVAL;
+		goto out;
+	}
+
+	rc = send_message(controld_fd, CM_MRESULT, OCFS2_FS_NAME,
+			  desc->r_name, result, desc->r_service);
+	if (rc) {
+		/* fprintf(stderr, "Unable to send MRESULT message: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	rc = receive_message(controld_fd, buf, &message, argv);
+	if (rc < 0) {
+		/* fprintf(stderr, "Error reading from daemon: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	switch (message) {
+		case CM_STATUS:
+			rc = parse_status(argv, &error, &error_msg);
+			if (rc) {
+				/* fprintf(stderr, "Bad status message: %s\n",
+					strerror(-rc)); */
+				goto out;
+			}
+			if (error) {
+				/* fprintf(stderr,
+					"Error %d from daemon: %s\n",
+					error, error_msg); */
+			}
+			break;
+
+		default:
+			/* fprintf(stderr,
+				"Unexpected message %s from daemon\n",
+				message_to_string(message)); */
+			goto out;
+			break;
+	}
+
+	err = 0;
+
+out:
+	if (controld_fd != -1) {
+		close(controld_fd);
+		controld_fd = -1;
+	}
+
+	return err;
 }
+
 static errcode_t cman_group_leave(const char *cluster_name,
 				  struct o2cb_region_desc *desc)
 {
-	return 0;
+	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
+	int rc;
+	int error;
+	char *error_msg;
+	client_message message;
+	char *argv[OCFS2_CONTROLD_MAXARGS + 1];
+	char buf[OCFS2_CONTROLD_MAXLINE];
+
+	if (controld_fd != -1) {
+		/* fprintf(stderr, "Join in progress!\n"); */
+		rc = -EINPROGRESS;
+		goto out;
+	}
+
+	rc = client_connect();
+	if (rc < 0) {
+		/* fprintf(stderr, "Unable to connect to ocfs2_controld: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+	controld_fd = rc;
+
+	rc = send_message(controld_fd, CM_UNMOUNT, OCFS2_FS_NAME,
+			  desc->r_name, desc->r_service);
+	if (rc) {
+		/* fprintf(stderr, "Unable to send UNMOUNT message: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	rc = receive_message(controld_fd, buf, &message, argv);
+	if (rc < 0) {
+		/* fprintf(stderr, "Error reading from daemon: %s\n",
+			strerror(-rc)); */
+		goto out;
+	}
+
+	switch (message) {
+		case CM_STATUS:
+			rc = parse_status(argv, &error, &error_msg);
+			if (rc) {
+				/* fprintf(stderr, "Bad status message: %s\n",
+					strerror(-rc)); */
+				goto out;
+			}
+			if (error) {
+				/* fprintf(stderr,
+					"Error %d from daemon: %s\n",
+					error, error_msg); */
+				goto out;
+			}
+			break;
+
+		default:
+			/* fprintf(stderr,
+				"Unexpected message %s from daemon\n",
+				message_to_string(message)); */
+			goto out;
+			break;
+	}
+
+	err = 0;
+
+out:
+	if (controld_fd != -1) {
+		close(controld_fd);
+		controld_fd = -1;
+	}
+
+	return err;
 }
 #endif
 
@@ -1308,7 +1589,7 @@
 
 errcode_t o2cb_complete_group_join(const char *cluster_name,
 				   struct o2cb_region_desc *desc,
-				   int error)
+				   int result)
 {
 	errcode_t err;
 	char _fake_cluster_name[NAME_MAX];
@@ -1326,7 +1607,7 @@
 		cluster_name = _fake_cluster_name;
 	}
 
-	return ops->complete_group_join(cluster_name, desc, error);
+	return ops->complete_group_join(cluster_name, desc, result);
 }
 
 errcode_t o2cb_group_leave(const char *cluster_name,

Modified: branches/cman-based/ocfs2_controld/main.c
===================================================================
--- branches/cman-based/ocfs2_controld/main.c	2007-08-17 22:40:52 UTC (rev 1394)
+++ branches/cman-based/ocfs2_controld/main.c	2007-08-18 00:10:36 UTC (rev 1395)
@@ -365,7 +365,7 @@
 
 	error = fcntl(fd, F_SETLK, &lock);
 	if (error) {
-		fprintf(stderr, "gfs_controld is already running\n");
+		fprintf(stderr, "ocfs2_controld is already running\n");
 		exit(EXIT_FAILURE);
 	}
 
@@ -399,7 +399,7 @@
 	close(0);
 	close(1);
 	close(2);
-	openlog("gfs_controld", LOG_PID, LOG_DAEMON);
+	openlog("ocfs2_controld", LOG_PID, LOG_DAEMON);
 
 	lockfile();
 }
@@ -442,7 +442,7 @@
 			break;
 
 		case 'V':
-			printf("gfs_controld (built %s %s)\n", __DATE__, __TIME__);
+			printf("ocfs2_controld (built %s %s)\n", __DATE__, __TIME__);
 			/* printf("%s\n", REDHAT_COPYRIGHT); */
 			exit(EXIT_SUCCESS);
 			break;

Modified: branches/cman-based/vendor/common/o2cb.init.sh
===================================================================
--- branches/cman-based/vendor/common/o2cb.init.sh	2007-08-17 22:40:52 UTC (rev 1394)
+++ branches/cman-based/vendor/common/o2cb.init.sh	2007-08-18 00:10:36 UTC (rev 1395)
@@ -1400,10 +1400,13 @@
     if_fail $?
 
     # Only unmount configfs if there are no other users
-    if [ -z "$(ls -1 "$(configfs_path)")" ]
+    if [ -d "$(configfs_path)" ]
     then
-        unmount_filesystem "configfs" "/sys/kernel/config"
-        if_fail $?
+        if [ -z "$(ls -1 "$(configfs_path)")" ]
+        then
+            unmount_filesystem "configfs" "$(configfs_path)"
+            if_fail $?
+        fi
     fi
 }
 




More information about the Ocfs2-tools-commits mailing list