From: Ian Campbell <Ian.Campbell@citrix.com>
To: Zhigang Wang <zhigang.x.wang@oracle.com>
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
Kouya Shimura <kouya@jp.fujitsu.com>,
xen-devel <xen-devel@lists.xen.org>
Subject: Re: [PATCH] tools/hotplug: fix locking
Date: Wed, 20 Jun 2012 16:34:23 +0100 [thread overview]
Message-ID: <1340206463.4906.72.camel@zakaz.uk.xensource.com> (raw)
In-Reply-To: <650b03f412143c3057ab.1339608555@zhigang.us.oracle.com>
On Wed, 2012-06-13 at 18:29 +0100, Zhigang Wang wrote:
> # HG changeset patch
> # User Zhigang Wang <zhigang.x.wang@oracle.com>
> # Date 1339608534 14400
> # Node ID 650b03f412143c3057abbd0ae0e256e6b3fd2ba8
> # Parent 32034d1914a607d7b6f1f060352b4cac973600f8
> tools/hotplug: fix locking
A better title would be "tools/hotplug: Switch to locking with flock"
since "fix" is not very descriptive.
The commit message should also state why changing this scheme is
preferable to fixing the current one.
Is this flock tool widely available? Does it need to be added to the
dependencies in the README?
> The current locking implementation would allow two processes get the lock
> simultaneously:
[...snip shell trace...]
Can you add a line or two of analysis to explain where in that shell
spew things are actually going wrong and why?
> This patch is ported from Red Hat Enterprise Linux 5.8.
I think we need a Signed-off-by from the original patch author. (Unless
DCO clause b somehow applies?)
Thanks,
Ian.
> Signed-off-by: Zhigang Wang <zhigang.x.wang@oracle.com>
> Cc: Kouya Shimura <kouya@jp.fujitsu.com>
>
> diff -r 32034d1914a6 -r 650b03f41214 tools/hotplug/Linux/locking.sh
> --- a/tools/hotplug/Linux/locking.sh Thu Jun 07 19:46:57 2012 +0100
> +++ b/tools/hotplug/Linux/locking.sh Wed Jun 13 13:28:54 2012 -0400
> @@ -1,5 +1,6 @@
> #
> # Copyright (c) 2005 XenSource Ltd.
> +# Copyright (c) 2007 Red Hat
> #
> # This library is free software; you can redistribute it and/or
> # modify it under the terms of version 2.1 of the GNU Lesser General Public
> @@ -19,92 +20,30 @@
> # Serialisation
> #
>
> -LOCK_SLEEPTIME=1
> -LOCK_SPINNING_RETRIES=5
> -LOCK_RETRIES=100
> LOCK_BASEDIR=/var/run/xen-hotplug
>
> +_setlockfd()
> +{
> + local i
> + for ((i = 0; i < ${#_lockdict}; i++))
> + do [ -z "${_lockdict[$i]}" -o "${_lockdict[$i]}" = "$1" ] && break
> + done
> + _lockdict[$i]="$1"
> + let _lockfd=200+i
> +}
> +
>
> claim_lock()
> {
> - local lockdir="$LOCK_BASEDIR/$1"
> - mkdir -p "$LOCK_BASEDIR"
> - _claim_lock "$lockdir"
> + mkdir -p "$LOCK_BASEDIR"
> + _setlockfd $1
> + eval "exec $_lockfd>>$LOCK_BASEDIR/$1"
> + flock -x $_lockfd
> }
>
>
> release_lock()
> {
> - _release_lock "$LOCK_BASEDIR/$1"
> + _setlockfd $1
> + flock -u $_lockfd
> }
> -
> -
> -# This function will be redefined in xen-hotplug-common.sh.
> -sigerr() {
> - exit 1
> -}
> -
> -
> -_claim_lock()
> -{
> - local lockdir="$1"
> - local owner=$(_lock_owner "$lockdir")
> - local retries=0
> -
> - while [ $retries -lt $LOCK_RETRIES ]
> - do
> - mkdir "$lockdir" 2>/dev/null && trap "_release_lock $lockdir; sigerr" ERR &&
> - _update_lock_info "$lockdir" && return
> -
> - local new_owner=$(_lock_owner "$lockdir")
> - if [ "$new_owner" != "$owner" ]
> - then
> - owner="$new_owner"
> - retries=0
> - else
> - local pid=$(echo $owner | cut -d : -f 1)
> - if [ -n "$pid" -a "$pid" != "unknown" -a ! -f "/proc/$pid/status" ]
> - then
> - _release_lock $lockdir
> - fi
> - fi
> -
> - if [ $retries -gt $LOCK_SPINNING_RETRIES ]
> - then
> - sleep $LOCK_SLEEPTIME
> - else
> - sleep 0
> - fi
> - retries=$(($retries + 1))
> - done
> - _steal_lock "$lockdir"
> -}
> -
> -
> -_release_lock()
> -{
> - trap sigerr ERR
> - rm -rf "$1" 2>/dev/null || true
> -}
> -
> -
> -_steal_lock()
> -{
> - local lockdir="$1"
> - local owner=$(cat "$lockdir/owner" 2>/dev/null || echo "unknown")
> - log err "Forced to steal lock on $lockdir from $owner!"
> - _release_lock "$lockdir"
> - _claim_lock "$lockdir"
> -}
> -
> -
> -_lock_owner()
> -{
> - cat "$1/owner" 2>/dev/null || echo "unknown"
> -}
> -
> -
> -_update_lock_info()
> -{
> - echo "$$: $0" >"$1/owner"
> -}
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2012-06-20 15:34 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-13 17:29 [PATCH] tools/hotplug: fix locking Zhigang Wang
2012-06-20 15:34 ` Ian Campbell [this message]
2012-06-20 17:53 ` Zhigang Wang
2012-06-21 11:42 ` Ian Campbell
2012-06-21 11:49 ` Ian Campbell
2012-06-21 12:08 ` Zhigang Wang
2012-06-21 12:23 ` Daniel P. Berrange
2012-06-21 13:07 ` Zhigang Wang
2012-06-21 12:20 ` Daniel P. Berrange
2012-06-26 15:53 ` Ian Campbell
2012-06-26 16:14 ` Daniel P. Berrange
2012-07-04 14:48 ` Ian Campbell
-- strict thread matches above, loose matches on Subject: below --
2012-06-11 13:59 Zhigang Wang
2012-06-12 6:53 ` Kouya Shimura
2012-06-13 2:25 ` Marek Marczykowski
2012-06-13 8:11 ` Ian Campbell
2012-06-13 8:16 ` Zhigang Wang
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=1340206463.4906.72.camel@zakaz.uk.xensource.com \
--to=ian.campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=kouya@jp.fujitsu.com \
--cc=xen-devel@lists.xen.org \
--cc=zhigang.x.wang@oracle.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).