On 2012/11/23 1:03, Luiz Capitulino wrote: > On Thu, 22 Nov 2012 11:15:49 +0900 > Tomoki Sekiyama <tomoki.sekiyama...@hitachi.com> wrote: > >> Adds sample hook scripts for --fsfreeze-hook option of qemu-ga. >> - fsfreeze-hook : execute scripts in fsfreeze-hook.d/ >> - fsfreeze-hook.d.sample/mysql-flush.sh : quiesce MySQL before snapshot <snip> >> +# Iterate executables in directory "fsfreeze-hook.d" with the specified args >> +[ ! -d "$FSFREEZE_D" ] && exit 1 >> +for file in "$FSFREEZE_D"/* ; do >> + is_ignored_file "$file" && continue >> + [ -x "$file" ] || continue >> + echo "$(date): execute $file $@" >>$LOGFILE >> + "$file" "$@" >>$LOGFILE 2>&1 >> + STATUS=$? >> + echo "$(date): $file finished with status=$STATUS" >>$LOGFILE >> +done > > execute_fsfreeze_hook() will fail the freeze process if this script fails. Two > comments: > > 1. Do we want to fail the freeze process if one of the sub-scripts fails? > If yes, then we have to exit 1 in the first failure
I originally thought the hooks are optional; even they failed, filesystem-level consistency are still kept in the snapshot. However, if we are going to fail fsfreeze process by one of sub-scripts' failure, we also need to notify scripts which already succeeded to pre-freeze to thaw (or abort) freezing, before exit 1 here. > 2. The exit status of the script will echo's exit status. I doubt we want > that Do you mean $STATUS (not $status) is specialized in some shell environments? >> diff --git a/docs/qemu-guest-agent/fsfreeze-hook.d.sample/mysql-flush.sh >> b/docs/qemu-guest-agent/fsfreeze-hook.d.sample/mysql-flush.sh >> new file mode 100755 >> index 0000000..e6d7998 >> --- /dev/null >> +++ b/docs/qemu-guest-agent/fsfreeze-hook.d.sample/mysql-flush.sh >> @@ -0,0 +1,47 @@ >> +#!/bin/sh >> + >> +# Flush MySQL tables to the disk before the filesystem is freezed. >> +# At the same time, this keeps a read lock while the filesystem is freezed >> +# in order to avoid write accesses by the other clients. >> + >> +MYSQL="mysql -uroot" #"-prootpassword" >> +FIFO=/tmp/mysql-flush.fifo >> + >> +flush_and_wait() { >> + printf "FLUSH TABLES WITH READ LOCK \\G\n" >> + read < $FIFO >> + printf "UNLOCK TABLES \\G\n" >> +} >> + >> +case "$1" in >> + freeze) >> + mkfifo $FIFO || exit 1 >> + flush_and_wait | $MYSQL & > > Honest question: what happens if I don't have mysql installed? Ah OK, availability of mysql should be checked in advance. Thanks, -- Tomoki Sekiyama <tomoki.sekiyama...@hitachi.com> Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory