example ethers hook: use lockfile-progs
[ganeti-local] / doc / examples / hooks / ethers
index 469af6b..8725f03 100755 (executable)
 # bridge to /etc/ethers.
 TARGET_BRIDGE="br0"
 DAEMON_PID_FILE="/var/run/dnsmasq.pid"
+
+# In order to handle concurrent execution of this lock, we use the $LOCKFILE.
+# LOCKFILE_CREATE and LOCKFILE_REMOVE are the path names for the lockfile-progs
+# programs which we use as helpers.
 LOCKFILE="/var/lock/ganeti_ethers.lock"
-LOCKTIMEOUT=10
-LOCKSLEEP=2
+LOCKFILE_CREATE="/usr/bin/lockfile-create"
+LOCKFILE_REMOVE="/usr/bin/lockfile-remove"
 
 hooks_path=$GANETI_HOOKS_PATH
 [ -n "$hooks_path" ] || exit 1
@@ -46,18 +50,8 @@ instance=$GANETI_INSTANCE_NAME
 nic_count=$GANETI_INSTANCE_NIC_COUNT
 
 acquire_lockfile() {
-  NOW=$(date +%s)
-  TIMEOUT=$(($NOW + $LOCKTIMEOUT))
-  while ! ( set -o noclobber; echo "$$" > $LOCKFILE) 2> /dev/null ; do
-    NOW=$(date +%s)
-    if [ $NOW -ge $TIMEOUT ]; then
-      logger -s "Cannot acquire lockfile for ethers update, giving up"
-      exit 1
-    fi
-    logger -s "Cannot acquire lockfile for ethers update, waiting"
-    sleep $LOCKSLEEP
-  done
-  trap "rm -f $LOCKFILE" EXIT
+  $LOCKFILE_CREATE -l $LOCKFILE || exit 1
+  trap "$LOCKFILE_REMOVE -l $LOCKFILE" EXIT
 }
 
 update_ethers_from_new() {