diff options
-rw-r--r-- | testing/ocfs2-tools/APKBUILD | 10 | ||||
-rw-r--r-- | testing/ocfs2-tools/ocfs2-tools.confd | 34 | ||||
-rw-r--r-- | testing/ocfs2-tools/ocfs2-tools.initd | 251 |
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 } |