CLOUDSTACK-3434: Improve the atomic of file lock used in VR

Now we would retry if "ls" failed, since the list of files changed.
This commit is contained in:
Sheng Yang 2013-07-12 17:34:47 -07:00
parent c1b0228f13
commit fd06009d50
1 changed files with 32 additions and 9 deletions

View File

@ -21,10 +21,26 @@
# getLockFile() parameters
# $1 lock filename
# $2 timeout seconds
#set -x
getCurrLock() {
result=`ls $__LOCKDIR/*-$1.lock 2>/dev/null | head -n1`
while [ $? -ne 0 ]
do
result=`ls $__LOCKDIR/*-$1.lock 2>/dev/null| head -n1`
done
echo $result
}
getLockFile() {
lock=$1
__locked=0
__TS=`date +%s%N`
__LOCKFILE="/tmp/$__TS-$$-$1.lock"
__LOCKDIR="/tmp"
__LOCKFILE="$__LOCKDIR/$__TS-$$-$lock.lock"
if [ $2 ]
then
__TIMEOUT=$2
@ -34,7 +50,7 @@ getLockFile() {
if [ -e $__LOCKFILE ]
then
logger -t cloud "Process $0 pid $$ want to get ECLUSIVE LOCK $1 RECURSIVELY!"
logger -t cloud "Process $0 pid $$ want to get ECLUSIVE LOCK $lock RECURSIVELY!"
psline=`ps u $$`
logger -t cloud "Failed job detail: $psline"
echo 0
@ -47,26 +63,32 @@ getLockFile() {
then
return
fi
for i in `seq 1 $(($__TIMEOUT * 10))`
do
currlock=`ls /tmp/*-$1.lock | head -n1`
currlock=$(getCurrLock $lock)
if [ $currlock -ef $__LOCKFILE ]
then
__locked=1
break
fi
sleep 0.1
if [ $((i % 10)) -eq 0 ]
then
logger -t cloud "Process $0 pid $$ waiting for the lock $1 for another 1 second"
logger -t cloud "Process $0 pid $$ waiting for the lock $lock for another 1 second"
fi
done
if [ $__locked -ne 1 ]
then
logger -t cloud "fail to acquire the lock $1 for process $0 pid $$ after $__TIMEOUT seconds time out!"
cmd=`cat $currlock`
logger -t cloud "waiting for command: $cmd"
logger -t cloud "fail to acquire the lock $lock for process $0 pid $$ after $__TIMEOUT seconds time out!"
cmd=`cat $currlock 2>/dev/null`
if [ $? -eq 0 ]
then
logger -t cloud "waiting for process: $cmd"
else
logger -t cloud "didn't get info about process who we're waiting for"
fi
psline=`ps u $$`
logger -t cloud "Failed job detail: $psline"
rm $__LOCKFILE
@ -78,7 +100,8 @@ getLockFile() {
# $1 lock filename
# $2 locked(1) or not(0)
releaseLockFile() {
__LOCKFILE="/tmp/*-$$-$1.lock"
__LOCKDIR="/tmp"
__LOCKFILE="$__LOCKDIR/*-$$-$1.lock"
__locked=$2
if [ "$__locked" == "1" ]
then