From: fabbione@sourceware.org <fabbione@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 ./WHATS_NEW scripts/clvmd_init_red_hat.in
Date: 26 Feb 2010 13:07:44 -0000 [thread overview]
Message-ID: <20100226130744.20778.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: fabbione at sourceware.org 2010-02-26 13:07:43
Modified files:
. : WHATS_NEW
scripts : clvmd_init_red_hat.in
Log message:
- fix whitespaces all over (tabs/spaces)
- increase timeout to 30 secs (on Chrissie request)
- source both cluster and clvmd for options (like all the other cluster
init scripts)
- add clustered_vgs and _lvs commodity fns
- move rh_status* fns at the top, so they can be reused
- heavily cleanup start and stop fns from redundant code and unnecessary
loops
- improve output from different operations
- make the init script lsb compliant
- don??t force kill of the daemon, send only a TERM signal and then wait
for it to exit
- Resolves rhbz#533247
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1439&r2=1.1440
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/scripts/clvmd_init_red_hat.in.diff?cvsroot=lvm2&r1=1.4&r2=1.5
--- LVM2/WHATS_NEW 2010/02/24 20:01:40 1.1439
+++ LVM2/WHATS_NEW 2010/02/26 13:07:43 1.1440
@@ -1,5 +1,6 @@
Version 2.02.62 -
====================================
+ Rewrite clvmd init script.
Remove lvs_in_vg_activated_by_uuid_only call.
Run device info query device by uuid only.
Don't touch /dev in vgmknodes if activation is disabled.
--- LVM2/scripts/clvmd_init_red_hat.in 2009/05/29 18:54:48 1.4
+++ LVM2/scripts/clvmd_init_red_hat.in 2010/02/26 13:07:43 1.5
@@ -1,171 +1,196 @@
#!/bin/bash
#
+# clvmd - Clustered LVM Daemon init script
+#
# chkconfig: - 24 76
-# description: Starts and stops clvmd
+# description: Cluster daemon for userland logical volume management tools.
#
# For Red-Hat-based distributions such as Fedora, RHEL, CentOS.
-#
+#
### BEGIN INIT INFO
-# Provides: clvmd
-# Required-Start: $local_fs
-# Required-Stop: $local_fs
-# Default-Start:
-# Default-Stop: 0 1 6
-# Short-Description: Clustered LVM Daemon
+# Provides: clvmd
+# Required-Start: $local_fs
+# Required-Stop: $local_fs
+# Short-Description: This service is Clusterd LVM Daemon.
+# Description: Cluster daemon for userland logical volume management tools.
### END INIT INFO
-. /etc/init.d/functions
+. /etc/rc.d/init.d/functions
DAEMON=clvmd
exec_prefix=@exec_prefix@
sbindir=@sbindir@
-LVDISPLAY=${sbindir}/lvdisplay
-VGCHANGE=${sbindir}/vgchange
-VGSCAN=${sbindir}/vgscan
-VGDISPLAY=${sbindir}/vgdisplay
-VGS=${sbindir}/vgs
+lvm_vgchange=${sbindir}/vgchange
+lvm_vgdisplay=${sbindir}/vgdisplay
+lvm_vgscan=${sbindir}/vgscan
+lvm_lvs=${sbindir}/lvs
-CLVMDOPTS="-T20"
+CLVMDOPTS="-T30"
[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster
+[ -f /etc/sysconfig/$DAEMON ] && . /etc/sysconfig/$DAEMON
[ -n "$CLVMD_CLUSTER_IFACE" ] && CLVMDOPTS="$CLVMDOPTS -I $CLVMD_CLUSTER_IFACE"
+# allow up to $CLVMD_STOP_TIMEOUT seconds to clvmd to complete exit operations
+# default to 10 seconds
+
+[ -z $CLMVD_STOP_TIMEOUT ] && CLVMD_STOP_TIMEOUT=10
+
LOCK_FILE="/var/lock/subsys/$DAEMON"
-start()
-{
- for rtrn in 0
- do
- if ! pidof $DAEMON > /dev/null
- then
- echo -n "Starting $DAEMON: "
- daemon $DAEMON $CLVMDOPTS
- rtrn=$?
- echo
- if [ $rtrn -ne 0 ]
- then
- break
- fi
- fi
- # refresh cache
- $VGSCAN > /dev/null 2>&1
-
- if [ -n "$LVM_VGS" ]
- then
- for vg in $LVM_VGS
- do
- action "Activating VG $vg:" $VGCHANGE -ayl $vg || rtrn=$?
- done
- else
- action "Activating VGs:" $VGCHANGE -ayl || rtrn=$?
- fi
+# NOTE: replace this with vgs, once display filter per attr is implemented.
+clustered_vgs() {
+ ${lvm_vgdisplay} 2>/dev/null | \
+ awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'
+}
+
+clustered_lvs() {
+ for i in $(clustered_vgs); do
+ ${lvm_lvs} -o lv_name --noheadings $i
done
+}
- return $rtrn
+rh_status() {
+ status $DAEMON
}
-stop()
+rh_status_q() {
+ rh_status >/dev/null 2>&1
+}
+
+start()
{
- for rtrn in 0
- do
- if [ -n "$LVM_VGS" ]
- then
- for vg in $LVM_VGS
- do
- action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
- done
- else
- # Hack to only deactivate clustered volumes
- clustervgs=`$VGDISPLAY 2> /dev/null | awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'`
- for vg in $clustervgs; do
- action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
- done
- fi
-
- [ $rtrn -ne 0 ] && break
-
- echo -n "Stopping clvm:"
- killproc $DAEMON -TERM
- rtrn=$?
+ if ! rh_status_q; then
+ echo -n "Starting $DAEMON: "
+ daemon $DAEMON $CLVMDOPTS || return $?
echo
- done
-
- return $rtrn
+ fi
+
+ # Refresh local cache.
+ #
+ # It's possible that new PVs were added to this, or other VGs
+ # while this node was down. So we run vgscan here to avoid
+ # any potential "Missing UUID" messages with subsequent
+ # LVM commands.
+
+ # The following step would be better and more informative to the user:
+ # 'action "Refreshing VG(s) local cache:" ${lvm_vgscan}'
+ # but it could show warnings such as:
+ # 'clvmd not running on node x-y-z Unable to obtain global lock.'
+ # and the action would be shown as FAILED when in reality it didn't.
+ # Ideally vgscan should have a startup mode that would not print
+ # unnecessary warnings.
+
+ ${lvm_vgscan} > /dev/null 2>&1
+
+ action "Activating VG(s):" ${lvm_vgchange} -ayl $LVM_VGS || return $?
+
+ touch $LOCK_FILE
+
+ return 0
}
wait_for_finish()
{
count=0
-
- while [ "$count" -le 10 -a -n "`pidof $DAEMON`" ]
- do
+ while [ "$count" -le "$CLVMD_STOP_TIMEOUT" ] && \
+ rh_status_q ]; do
sleep 1
- count=$((count + 1))
+ count=$((count+1))
done
-
- if [ `pidof $DAEMON` ]
- then
+
+ ! rh_status_q
+}
+
+stop()
+{
+ rh_status_q || return 0
+
+ action "Deactivating clusterd VG(s):" ${lvm_vgchange} -anl ${LVM_VGS:-$(clustered_vgs)} || return $?
+
+ action "Signaling $DAEMON to exit" kill -TERM $(pidofproc $DAEMON) || return $?
+
+ # wait half second before we start the waiting loop or we will show
+ # the loop more time than really necessary
+ usleep 500000
+
+ # clvmd could take some time to stop
+ rh_status_q && action "Waiting for $DAEMON to exit:" wait_for_finish
+
+ if rh_status_q; then
+ echo -n "$DAEMON failed to exit"
+ failure
+ echo
return 1
else
- return 0
+ echo -n "$DAEMON terminated"
+ success
+ echo
fi
-}
-reload() {
- $DAEMON -R
-}
+ rm -f $LOCK_FILE
-rh_status() {
- status $DAEMON
+ return 0
}
-rh_status_q() {
- rh_status >/dev/null 2>&1
+reload() {
+ rh_status_q || exit 7
+ action "Reloading $DAEMON configuration: " $DAEMON -R || return $?
}
-
-rtrn=1
+restart() {
+ # if stop fails, restart will return the error and not attempt
+ # another start. Even if start is protected by rh_status_q,
+ # that would avoid spawning another daemon, it would try to
+ # reactivate the VGs.
+ stop && start
+}
# See how we were called.
case "$1" in
start)
start
rtrn=$?
- [ $rtrn = 0 ] && touch $LOCK_FILE
;;
stop)
stop
rtrn=$?
- [ $rtrn = 0 ] && rm -f $LOCK_FILE
;;
- restart)
- if stop
- then
- wait_for_finish
- start
- fi
+ restart|force-reload)
+ restart
rtrn=$?
;;
+ condrestart|try-restart)
+ rh_status_q || exit 0
+ restart
+ rtrn=$?
+ ;;
+
reload)
- rh_status_q || exit 7
reload
+ rtrn=$?
;;
status)
rh_status
rtrn=$?
- vols=$( $LVDISPLAY -C --nohead 2> /dev/null | awk '($3 ~ /....a./) {print $1}' )
- echo active volumes: ${vols:-"(none)"}
+ if [ $rtrn = 0 ]; then
+ cvgs="$(clustered_vgs)"
+ echo Active clustered Volume Groups: ${cvgs:-"(none)"}
+ clvs="$(clustered_lvs)"
+ echo Active clustered Logical Volumes: ${clvs:-"(none)"}
+ fi
;;
*)
- echo $"Usage: $0 {start|stop|restart|reload|status}"
+ echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+ rtrn=2
;;
esac
next reply other threads:[~2010-02-26 13:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-26 13:07 fabbione [this message]
-- strict thread matches above, loose matches on Subject: below --
2010-08-12 9:15 LVM2 ./WHATS_NEW scripts/clvmd_init_red_hat.in fabbione
2010-06-23 16:24 mbroz
2010-06-03 21:03 mbroz
2010-05-17 3:18 fabbione
2009-05-29 18:34 snitzer
2009-02-10 11:53 ccaulfield
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100226130744.20778.qmail@sourceware.org \
--to=fabbione@sourceware.org \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.