mirror of https://github.com/apache/cloudstack.git
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:
parent
c1b0228f13
commit
fd06009d50
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue