aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--testing/ocfs2-tools/APKBUILD10
-rw-r--r--testing/ocfs2-tools/ocfs2-tools.confd34
-rw-r--r--testing/ocfs2-tools/ocfs2-tools.initd251
3 files changed, 210 insertions, 85 deletions
diff --git a/testing/ocfs2-tools/APKBUILD b/testing/ocfs2-tools/APKBUILD
index 653918006a..34b613418c 100644
--- a/testing/ocfs2-tools/APKBUILD
+++ b/testing/ocfs2-tools/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Leonardo Arena <rnalrd@alpinelinux.org>
pkgname=ocfs2-tools
pkgver=1.4.4
-pkgrel=1
+pkgrel=2
pkgdesc="Oracle Cluster File System 2 utilities"
url="http://oss.oracle.com/projects/ocfs2-tools"
arch="all"
@@ -51,12 +51,12 @@ package() {
make DESTDIR="$pkgdir" install
# remove the 2 lines below (and this) if there is no init.d script
- install -m755 -D "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
- install -m644 -D "$srcdir"/$pkgname.confd "$pkgdir"/etc/conf.d/$pkgname
+ install -m755 -D "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/o2cb
+ install -m644 -D "$srcdir"/$pkgname.confd "$pkgdir"/etc/conf.d/o2cb
}
md5sums="f7ae245e8baa499aa56d7af25a7885d5 ocfs2-tools-1.4.4.tar.gz
5dba18ca5596b1de0f2eeb30f5ed1656 gcc45-ftbfs.patch
c938040f0e77a4bb23e952c8f99b6cc5 build.patch
-5bc9de63e86fe8bd50c9c782e4a10076 ocfs2-tools.initd
-5c8e7b397fec3df784963eb55028cc8e ocfs2-tools.confd"
+601fbd79acdc52a9046293aa977b1547 ocfs2-tools.initd
+d81b6ab068ec92a137b58c9ad56c4637 ocfs2-tools.confd"
diff --git a/testing/ocfs2-tools/ocfs2-tools.confd b/testing/ocfs2-tools/ocfs2-tools.confd
index 29b236dec6..29bc08406a 100644
--- a/testing/ocfs2-tools/ocfs2-tools.confd
+++ b/testing/ocfs2-tools/ocfs2-tools.confd
@@ -1,6 +1,38 @@
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-fs/ocfs2-tools/files/Attic/ocfs2.conf,v 1.2 2009/10/08 09:03:35 flameeyes dead $
+# $Header: /var/cvsroot/gentoo-x86/sys-fs/ocfs2-tools/files/ocfs2.conf,v 1.1 2006/07/20 05:13:14 dberkholz Exp $
# Put your cluster names here, separated by space, ie.
# OCFS2_CLUSTER="cluster1 admincluster cluster2"
+OCFS2_CLUSTER="ocfs2"
+
+# Some heartbeat tweaks to prevent self-fencing quite so much during heavy load.
+# http://oss.oracle.com/projects/ocfs2/dist/documentation/ocfs2_faq.html
+
+# How long to wait before a node is considered dead from lack of network activity.
+OCFS2_IDLE_TIMEOUT_MS="30000"
+# How often we should attempt to send heartbeats.
+OCFS2_KEEPALIVE_DELAY_MS="2000"
+OCFS2_RECONNECT_DELAY_MS="2000"
+# How often we should attempt to send heartbeats.
+# How many interations before a node is considered dead from lack of IO activity.
+# (dead_threshold - 1) * 2s
+OCFS2_DEAD_THRESHOLD="31"
+
+# Default: "-fy" (force check on double-unmounted boot). I beleave this is best.
+# Native way is "-y", but once I have twice reboot/powerOFF with bad result...
+# Affected only fstab.
+OCFS2_FSCK="-fy"
+
+# http://oss.oracle.com/projects/ocfs2-tools/news/article_8.html
+# starting from 1.4.3, fsck.ocfs2 "aggressively cache the metadata blocks"
+# this is useful on lots of free memory, but I have heavy slowdown on x86_64
+# with 1G of RAM.
+# "yes" will "swapoff -a" & "swapon -a" around fsck to avoid caching over swap
+OCFS2_FSCK_SWAPOFF="yes"
+
+# Signal to kill processes on stop/umount on busy device (empty to not kill)
+#OCFS2_UMOUNT_KILL="KILL"
+
+# "yes" to force stop
+#OCFS2_FORCE_STOP="no"
diff --git a/testing/ocfs2-tools/ocfs2-tools.initd b/testing/ocfs2-tools/ocfs2-tools.initd
index 32abd47e48..677b498f88 100644
--- a/testing/ocfs2-tools/ocfs2-tools.initd
+++ b/testing/ocfs2-tools/ocfs2-tools.initd
@@ -1,100 +1,193 @@
#!/sbin/runscript
-# Copyright 1999-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-fs/ocfs2-tools/files/Attic/ocfs2.init,v 1.2 2009/10/08 09:03:35 flameeyes dead $
+
+: ${OCFS2_FSCK:="-fy"}
depend() {
need net localmount
- before netmount
+ before netmount
+ after drbd
}
-check_modules() {
- local MODULES="ocfs2_dlmfs ocfs2 ocfs2_dlm ocfs2_nodemanager configfs"
- local MODULE
- local MODPROBE="modprobe -l"
- local retval=0
-
- for MODULE in ${MODULES}; do
- if [ -z "`${MODPROBE} ${MODULE}`" ] ; then
- retval=1
- fi
+pseudofs() {
+ [ -n "`mount -t $1`" ] && return 0
+ ewarn "OCFS2: Pseudo-filesystem $1 are not mounted."
+ ewarn "Make sure you have following lines in your /etc/fstab:"
+ ewarn "none $2 $1 defaults 0 0"
+
+ # Why not?
+ ebegin "Mounting $1"
+ mount -t $1 none $2 && [ -n "`mount -t $1`" ]
+ eend $? || return 1
+}
+
+fmod() {
+ [[ -e "$1" ]] && return 0
+ modprobe -s $2 && [[ -e "$1" ]] && return 0
+ eerror "OCFS2: Module '$2' failed, '$1' not found"
+ return 1
+}
+
+# unsure about possibility to keep heartbeat unclean after correct umount
+# but Oracle do so
+clean_heartbeat(){
+ local err=0 id
+ for i in "/sys/kernel/config/cluster/$1/heartbeat"/*; do
+ [[ -d "$i" ]] || continue
+ id="${i##*/}"
+ ebegin "Cleaning OCFS2 heartbeat region $1/$id"
+ [[ "`/sbin/ocfs2_hb_ctl -I -u "$id" | grep -o " [0-9]* refs$"`" == " 0 refs" ]] && /sbin/ocfs2_hb_ctl -K -u "$id" || ! [[ -d "$i" ]]
+ eend $? || err=1
done
- if [ ${retval} -eq 1 ] ; then
- ewarn "One or more required modules are not loaded."
- ewarn "Make sure you have "
- ewarn " - placed ocfs, dlmfs and configfs into /etc/modules.autoload.d/kernel-2.6"
- ewarn "For a (in)complete documentation, read /usr/share/doc/ocfs-<version>/INSTALL.GENTOO.gz"
- fi
- return ${retval}
+ return $err
}
-check_pseudofs() {
- local retval=0
- local HASMOUNT="mount -l -t"
- if [ -z "`${HASMOUNT} configfs`" ] ; then
- retval=1
- fi
- if [ -z "`${HASMOUNT} ocfs2_dlmfs`" ] ; then
- retval=1
- fi
+UUID(){
+ local dev fs stack uuid label
+ /sbin/mounted.ocfs2 -d|while read dev fs stack uuid label; do
+ [[ "$stack" == "o2cb" ]] && echo "$uuid"
+ done|sort -u
+}
- if [ ${retval} -eq 1 ]; then
- ewarn "One or more pseudo-filesystes are not mounted."
- ewarn "Make sure you have following lines in your /etc/fstab:"
- ewarn "none /config configfs defaults 0 0"
- ewarn "none /dlm ocfs2_dlmfs defaults 0 0"
- ewarn "For a (in)complete documentation, read /usr/share/doc/ocfs-<version>/INSTALL.GENTOO.gz"
- fi
- return ${retval}
+clusters(){
+ [[ -z "${OCFS2_CLUSTER}" ]] && for i in /sys/kernel/config/cluster/*; do
+ OCFS2_CLUSTER="${OCFS2_CLUSTER} ${i##*/}"
+ done
+ echo "${OCFS2_CLUSTER}"
}
+stop_cluster(){
+ if clean_heartbeat $1 || [[ "${OCFS2_FORCE_STOP}" == yes ]]; then
+ ebegin "Stopping OCFS2 cluster '$1'"
+ /sbin/o2cb_ctl -H -n $1 -t cluster -a online=no >/dev/null
+ eend $? || return 1
+ else
+ return 1
+ fi
+}
+online(){
+ local cluster
+ for cluster in ${*:-$(clusters)}; do
+ grep -q "^1\$" /sys/kernel/config/cluster/$cluster/node/*/local 2>/dev/null || return 1
+ done
+ return 0
+}
start() {
- check_modules || return $?
- check_pseudofs || return $?
-
- einfo "Starting OCFS2 cluster"
- for cluster in ${OCFS2_CLUSTER}; do
- ebegin " - ${cluster}"
- /sbin/o2cb_ctl -H -n ${cluster} -t cluster -a online=yes >/dev/null 2>&1
- eend $?
+ ( fmod /sys/fs/ocfs2 ocfs2 &&
+ fmod /sys/fs/ocfs2/cluster_stack ocfs2_stackglue &&
+ pseudofs configfs /sys/kernel/config &&
+ pseudofs ocfs2_dlmfs /dlm
+ ) || return 1
+ echo o2cb >/sys/fs/ocfs2/cluster_stack 2>/dev/null
+ if [[ "`cat /sys/fs/ocfs2/cluster_stack`" != "o2cb" ]]; then
+ eerror "OCFS2: Stack 'o2cb' not loaded. Check your kernel config."
+ return 1
+ fi
+
+ # autodetect
+ : ${OCFS2_CLUSTER:=$(UUID)}
+
+ for cluster in $(clusters); do
+ ebegin "Starting OCFS2 cluster '${cluster}'"
+ online $cluster || /sbin/o2cb_ctl -H -n ${cluster} -t cluster -a online=yes >/dev/null
+ if ! eend $? ; then
+ local OCFS2_FORCE_STOP=no
+ stop_cluster $cluster
+ return 1
+ fi
+
+ # Some heartbeat tweaks to prevent self-fencing quite so much during heavy load.
+ # http://oss.oracle.com/projects/ocfs2/dist/documentation/ocfs2_faq.html
+
+ # How long to wait before a node is considered dead from lack of network activity.
+ echo $OCFS2_IDLE_TIMEOUT_MS > /sys/kernel/config/cluster/${cluster}/idle_timeout_ms
+ # How often we should attempt to send heartbeats.
+ echo $OCFS2_KEEPALIVE_DELAY_MS > /sys/kernel/config/cluster/${cluster}/keepalive_delay_ms
+ echo $OCFS2_RECONNECT_DELAY_MS > /sys/kernel/config/cluster/${cluster}/reconnect_delay_ms
+ # How many interations before a node is considered dead from lack of IO activity.
+ # (dead_threshold - 1) * 2s
+ echo $OCFS2_DEAD_THRESHOLD > /sys/kernel/config/cluster/${cluster}/heartbeat/dead_threshold
+ done
+
+ local i
+ for i in 9 8 7 6 5 4 3 2 1 0; do
+ online && break
+ echo -n "$i"
+ sleep 1
done
+ # usure: IMHO locking not starts here
+# let i=OCFS2_RECONNECT_DELAY_MS*2/1000
+# sleep $i
+
+ # Voluntary fsck. Will be happened only ondemand -
+ # on both unmounted/double fault, placed in fstab.
+ [[ "$OCFS2_FSCK_SWAPOFF" == "yes" ]] && swapoff -a
+ for i in `mount -invfat ocfs2 2>/dev/null|sed -e 's: .*::g'` ; do
+ [[ -e "$i" ]] || continue
+ einfo "OCFS2: Trying 'fsck.ocfs2 $OCFS2_FSCK $i' (fs check if possible)"
+ /sbin/fsck.ocfs2 $OCFS2_FSCK "$i" 2>/dev/null
+ done
+ [[ "$OCFS2_FSCK_SWAPOFF" == "yes" ]] && swapon -a
+
+ # Any behaviour
+ ebegin "Mounting OCFS2 filesystems"
+ mount -at ocfs2
+ eend $?
+ return $?
+}
+
+_fuser(){
+ fuser -"${OCFS2_UMOUNT_KILL}" -v"${OCFS2_UMOUNT_KILL:+k}" $*
+ return $?
+}
+
+_umount(){
+ local i m
+ i=`umount $* 2>&1` && {
+ echo -n "$i"
+ return 0
+ }
+ echo "$i"
+ _fuser -mM `echo "$i"|grep "^umount: .* device is busy\.\$"|sed -e 's%^umount: \([^ ]*\): device is busy\.$%\1%g'` || return 1
+ [[ -z "${OCFS2_UMOUNT_KILL}" ]] && return 1
+ umount $* && return 0
+ sleep 1
+ umount $*
+ return $?
}
stop() {
- # Shamelesly stolen from netmount
- local ret
- ebegin "Unmounting OCFS2 filesystems"
- [ -z "$(umount -art ocfs2 2>&1)" ]
- ret=$?
- eend ${ret} "Failed to simply unmount filesystems"
- [ ${ret} -eq 0 ] && return 0
-
- declare -a siglist=( "TERM" "KILL" "KILL" )
- local retry=0
- local remaining="go"
-
- while [ -n "${remaining}" -a ${retry} -lt 3 ]
- do
- remaining="$(awk '$3 ~ /'ocfs2'/ { if ($2 != "/") print $2 }' /proc/mounts | sort -r)"
- IFS=$'\n'
- set -- ${remaining//\\040/ }
- unset IFS
- [ -z "${remaining}" ] && break
-
- ebegin $'\t'"Unmounting ocfs2 filesystems (retry #$((retry+1)))"
- /bin/fuser -k -${siglist[$((retry++))]} -m "$@" &>/dev/null
- sleep 5
- umount "$@" &>/dev/null
- eend $? $'\t'"Failed to unmount filesystems"
- done
-
-
- einfo "Stopping OCFS2 cluster"
- for cluster in ${OCFS_CLUSTERS}; do
- ebegin " - ${cluster}"
- /sbin/o2cb_ctl -H -n ${cluster} -t cluster -a online=no >/dev/null 2>&1
- eend $?
+ local ret=0 dev m i
+ # now umount only clusters - under heartbeat. others later
+# ebegin "Unmounting OCFS2 filesystems"
+# _umount -at ocfs2
+# eend $?
+# ret=$?
+
+ for cluster in $(clusters); do
+ for dev in `cat /sys/kernel/config/cluster/$cluster/heartbeat/*/dev 2>/dev/null`; do
+ m=`grep "/dev/$dev " /proc/mounts|sed -e 's:^[^ ]* \([^ ]*\) .*$:\1:g'`
+ [[ -z "$m" ]] && continue
+ ebegin "Unmounting OCFS2 cluster '$cluster' filesystems '$dev' from '$m'"
+ if _umount $m; then
+ eend 0
+ continue
+ elif umount $m; then
+ einfon "Lazy unmounted. Waiting "
+ for i in 9 8 7 6 5 4 3 2 1 0; do
+ ( /sbin/ocfs2_hb_ctl -I -d /dev/$dev || break ) | grep -q " 0 refs\$" && break
+ echo -n "$i"
+ _fuser $m
+ sleep 1
+ done
+ echo
+ [[ "$i" != 0 ]] && continue
+ fi
+ eend 1
+ ret=1
+ done
+ stop_cluster $cluster || ret=1
done
+ return $ret
}