[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