From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:47753) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tcynz-0007rM-VE for qemu-devel@nongnu.org; Mon, 26 Nov 2012 08:33:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tcynp-0003Jr-QZ for qemu-devel@nongnu.org; Mon, 26 Nov 2012 08:32:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50332) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tcynp-0003HX-Iv for qemu-devel@nongnu.org; Mon, 26 Nov 2012 08:32:49 -0500 Date: Mon, 26 Nov 2012 10:40:01 -0200 From: Luiz Capitulino Message-ID: <20121126104001.01d68e50@doriath.home> In-Reply-To: <50B3573D.8070705@hitachi.com> References: <20121122021535.9852.40353.stgit@melchior2.sdl.hitachi.co.jp> <20121122021549.9852.73727.stgit@melchior2.sdl.hitachi.co.jp> <20121122140343.18a911fe@doriath.home> <50B3573D.8070705@hitachi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4 2/2] qemu-ga: sample fsfreeze hooks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Tomoki Sekiyama Cc: qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com On Mon, 26 Nov 2012 20:49:17 +0900 Tomoki Sekiyama wrote: > On 2012/11/23 1:03, Luiz Capitulino wrote: > > On Thu, 22 Nov 2012 11:15:49 +0900 > > Tomoki Sekiyama 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 > > >> +# 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. Right, which makes things more complex. I vote for doing it the simpler way for now then, which is to ignore subscripts exit status. But then you should add exit 0 after the loop to avoid this: > > 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? No, what I meant is that (afaik) when the script finishes, its return status to qemu-ga is actually going to be the latest call echo exit status because it's the last command executed in the loop. If echo fails (say no space) then the script will fail. We either, ignore any failures in qemu-ga itself (although we should at least print a warning there) and/or add exit 0 as the last line of the script. > > >> 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,