[Ocfs2-tools-commits] smushran commits r839 - in trunk: libo2cb libo2cb/include o2cb_ctl vendor/common

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Mon Apr 25 20:15:25 CDT 2005


Author: smushran
Signed-off-by: jlbec
Date: 2005-04-25 20:15:23 -0500 (Mon, 25 Apr 2005)
New Revision: 839

Modified:
   trunk/libo2cb/include/o2cb.h
   trunk/libo2cb/o2cb_abi.c
   trunk/o2cb_ctl/o2cb_ctl.c
   trunk/vendor/common/o2cb.init
Log:
Added stop and status support to o2cb.init
Added offline_cluster() to o2cb_ctl.c
Added o2cb_remove_cluster() and o2cb_del_node() to o2cb_abi.c
Signed-off-by: jlbec

Modified: trunk/libo2cb/include/o2cb.h
===================================================================
--- trunk/libo2cb/include/o2cb.h	2005-04-25 22:13:52 UTC (rev 838)
+++ trunk/libo2cb/include/o2cb.h	2005-04-26 01:15:23 UTC (rev 839)
@@ -48,10 +48,13 @@
 #endif
 
 errcode_t o2cb_create_cluster(const char *cluster_name);
+errcode_t o2cb_remove_cluster(const char *cluster_name);
+
 errcode_t o2cb_add_node(const char *cluster_name,
 			const char *node_name, const char *node_num,
 			const char *ip_address, const char *ip_port,
 			const char *local);
+errcode_t o2cb_del_node(const char *cluster_name, const char *node_name);
 
 errcode_t o2cb_list_clusters(char ***clusters);
 void o2cb_free_cluster_list(char **clusters);

Modified: trunk/libo2cb/o2cb_abi.c
===================================================================
--- trunk/libo2cb/o2cb_abi.c	2005-04-25 22:13:52 UTC (rev 838)
+++ trunk/libo2cb/o2cb_abi.c	2005-04-26 01:15:23 UTC (rev 839)
@@ -90,6 +90,47 @@
 	return err;
 }
 
+errcode_t o2cb_remove_cluster(const char *cluster_name)
+{
+	char path[PATH_MAX];
+	int ret;
+	errcode_t err = 0;
+
+	ret = snprintf(path, PATH_MAX - 1, O2CB_FORMAT_CLUSTER,
+		       cluster_name);
+	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
+		return O2CB_ET_INTERNAL_FAILURE;
+
+	ret = rmdir(path);
+	if (ret) {
+		switch (errno) {
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			case ENOMEM:
+				err = O2CB_ET_NO_MEMORY;
+				break;
+
+			case ENOTDIR:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case ENOENT:
+				err = 0;
+				break;
+
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+		}
+	}
+
+	return err;
+}
+
 static int do_read(int fd, void *bytes, size_t count)
 {
 	int total = 0;
@@ -322,6 +363,50 @@
 	return err;
 }
 
+errcode_t o2cb_del_node(const char *cluster_name, const char *node_name)
+{
+	char node_path[PATH_MAX];
+	int ret;
+	errcode_t err;
+
+	ret = snprintf(node_path, PATH_MAX - 1, O2CB_FORMAT_NODE,
+		       cluster_name, node_name);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	ret = rmdir(node_path);
+	if (ret) {
+		switch (errno) {
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			case ENOMEM:
+				err = O2CB_ET_NO_MEMORY;
+				break;
+
+			case ENOTDIR:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case ENOENT:
+				err = 0;
+				break;
+
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+		}
+	}
+
+out:
+	return err;
+}
+
 static errcode_t o2cb_set_region_attribute(const char *cluster_name,
 					   const char *region_name,
 					   const char *attr_name,

Modified: trunk/o2cb_ctl/o2cb_ctl.c
===================================================================
--- trunk/o2cb_ctl/o2cb_ctl.c	2005-04-25 22:13:52 UTC (rev 838)
+++ trunk/o2cb_ctl/o2cb_ctl.c	2005-04-26 01:15:23 UTC (rev 839)
@@ -915,9 +915,51 @@
 
 static gint offline_cluster(O2CBContext *ctxt, O2CBCluster *cluster)
 {
-    fprintf(stderr,
-            PROGNAME ": Offline of cluster not supported yet\n");
-    return -ENOTSUP;
+    errcode_t ret;
+    gint rc;
+    gchar *cluster_name = NULL;
+    char **node_name = NULL;
+    int i = 0;
+
+    rc = -ENOMEM;
+    cluster_name = o2cb_cluster_get_name(cluster);
+    if (!cluster_name)
+        goto out_error;
+
+    ret = o2cb_list_nodes(cluster_name, &node_name);
+    if (ret && ret != O2CB_ET_SERVICE_UNAVAILABLE) {
+        com_err(PROGNAME, ret, "while listing nodes in cluster '%s'",
+                cluster_name);
+        goto out_error;
+    }
+
+    rc = -EIO;
+    while(node_name && node_name[i] && *(node_name[i])) {
+        ret = o2cb_del_node(cluster_name, node_name[i]);
+        if (ret) {
+            com_err(PROGNAME, ret, "while deleting node '%s' in cluster '%s'",
+                    node_name[i], cluster_name);
+            goto out_error;
+        }
+        i++;
+    }
+
+    ret = o2cb_remove_cluster(cluster_name);
+    if (ret && ret != O2CB_ET_SERVICE_UNAVAILABLE) {
+        com_err(PROGNAME, ret, "while removing cluster '%s'", cluster_name);
+        goto out_error;
+    }
+
+    rc = 0;
+
+out_error:
+    if (node_name)
+        o2cb_free_nodes_list(node_name);
+
+    if (cluster_name)
+        g_free(cluster_name);
+
+    return rc;
 }  /* offline_cluster() */
 
 static gint run_change_cluster_one(O2CBContext *ctxt,

Modified: trunk/vendor/common/o2cb.init
===================================================================
--- trunk/vendor/common/o2cb.init	2005-04-25 22:13:52 UTC (rev 838)
+++ trunk/vendor/common/o2cb.init	2005-04-26 01:15:23 UTC (rev 839)
@@ -226,8 +226,77 @@
     return 0
 }
 
+#
+# check_heartbeat()
+#
+# 0 is hb not active, 1 is hb active
+#
+check_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
 
+    for i in "/config/cluster/${CLUSTER}/heartbeat/"*
+    do
+        HBUUID="`echo $i | cut -f6 -d/`"
+        if [ "${HBUUID}" = "*" ]
+        then
+            break;
+        else
+            return 1;
+        fi
+    done
+    return 0
+}
+
 #
+# clean_heartbeat()
+# Removes the inactive heartbeat regions
+# 
+clean_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "clean_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    echo -n "Cleaning heartbeat on ${CLUSTER}: "
+
+    for i in "/config/cluster/${CLUSTER}/heartbeat/"*
+    do
+        HBUUID="`echo $i | cut -f6 -d/`"
+        if [ "${HBUUID}" = "*" ]
+        then
+            break;
+        fi
+        OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
+        if [ $? != 0 ]
+        then
+            echo "Failed"
+            echo "${OUTPUT}" >&2
+            exit 1
+        fi
+
+        REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
+        if [ $REF != 0 ]
+        then
+           echo "Failed"
+           echo "Error: Atleast one heartbeat region still active" >&2
+           exit 1
+        else
+           OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
+        fi
+    done
+    echo "OK"
+}
+
+#
 # unload_module()
 # Unload a module
 #
@@ -270,7 +339,32 @@
     return 0
 }
 
+#
+# check_load_module()
+#
+# 0 is not loaded, 1 is error, 2 is already loaded
+#
+check_load_module()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_load_module(): Requires an argument" >&2
+        return 1
+    fi
+    MODNAME="$1"
 
+    echo -n "Module \"$MODNAME\": "
+    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        echo "Not loaded"
+        return 0
+    fi
+    echo "Loaded"
+    return 2
+}
+
+
 #
 # mount_fs()
 # Mount a filesystem.
@@ -306,7 +400,28 @@
     return 0
 }
 
+#
+# check_mount_fs()
+#
+# 0 is not mounted, 1 is error, 2 is already mounted
+#
+check_mount_fs()
+{
+    TYPE="$1"
+    FULL_MOUNT="$2"
+    FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
+    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
 
+    echo -n "Filesystem \"$TYPE\": "
+    if [ -n "$MOUNTOUT" ]
+    then
+        echo "Mounted"
+        return 2
+    fi
+    echo "Not mounted"
+    return 0
+}
+
 #
 # unmount_fs()
 # Unmount a filesystem
@@ -344,6 +459,14 @@
     done
 }
 
+load_status()
+{
+    for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
+	eval "check_${LOAD_ACTIONS[i]}"
+    done
+    return "$?"
+}
+
 online()
 {
     CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
@@ -363,6 +486,31 @@
     if_fail "$?" "$OUTPUT"
 }
 
+offline()
+{
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return
+    fi
+
+    clean_heartbeat $CLUSTER
+
+    echo -n "Stopping cluster ${CLUSTER}: "
+    check_heartbeat $CLUSTER
+    if [ $? != 0 ]
+    then
+        echo "Failed"
+        echo "Unable to stop cluster as heartbeat region still active" >&2
+    fi
+
+    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
+    if_fail "$?" "$OUTPUT"
+
+    unload_module ocfs2
+    if_fail "$?"
+}
+
 start()
 {
     if [ "$O2CB_ENABLED" != "true" ]
@@ -384,6 +532,7 @@
 
 stop()
 {
+    offline "$2"
     unload
 }
 
@@ -396,8 +545,32 @@
 
 status()
 {
-	echo broken
-	exit
+    load_status
+    if [ $? = 1 ]
+    then
+        return 0;
+    fi
+
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return 1;
+    fi
+
+#TODO Add Cluster online check
+
+    echo -n "Checking heartbeat: "
+    check_heartbeat $CLUSTER
+    if [ $? = 0 ]
+    then
+        echo "Not active"
+        return 0;
+    else
+        echo "Active"
+    fi
+
+    exit 1
+
     echo -n "Checking if O2CB is loaded: "
     RC=0
     for MODSPEC in $MODULE_LIST
@@ -470,8 +643,12 @@
         online "$2"
         ;;
 
+    offline)
+        offline "$2"
+        ;;
+
     unload)
-        # offline
+        offline "$2"
         unload
         ;;
 
@@ -500,7 +677,7 @@
         ;;
 
     *)
-        echo "Usage: $0 {start|stop|restart|enable|disable|configure|load|unload|online|status}"
+        echo "Usage: $0 {start|stop|restart|enable|disable|configure|load|unload|online|offline|status}"
         exit 1
         ;;
 esac



More information about the Ocfs2-tools-commits mailing list