Hi!
Here is a locking sample (potential replacement functions) that seems to work:
Just start the script more than once as a background process and watch the
output
-----------snip locks.sh --------------------
MASTERLOCKFILE=/tmp/blabla
lock() {
(flock -e 123 &&
if [ -e "$1" ]; then
if ! kill -0 $(<"$1") 2>&1 > /dev/null; then
# stale lock
echo $$ > "$1"
else
false
fi
else
echo $$ > "$1"
fi) 123> $MASTERLOCKFILE
}
unlock() {
(flock -e 124 && test -e "$1" && rm "$1") 124> $MASTERLOCKFILE
}
# "application"
while true
do
while ! lock /tmp/foobar; do
echo "waiting for lock $$"
sleep 0.2
done
echo "lock OK $$"
sleep 0.1
if unlock /tmp/foobar; then
echo "unlock OK $$"
else
echo "unlock FAIL $$"
fi
sleep 0.1
done
---------------------snip--------------------
Regards,
Ulrich
>>> "Ulrich Windl" <[email protected]> schrieb am 28.11.2011 um
10:07 in Nachricht <[email protected]>:
> Hi!
>
> I was requested to work around a kernel bug by adding locks to my RA.
> Reading the docs I found that ist supposed to be done via
>
> ocf_take_lock $LOCKFILE
> and
> ocf_release_lock_on_exit $LOCKFILE
>
> Out of curiosity I inspected the implementation in SLES11 SP1. To me the
> functions are improperly implemented (unless I'm wrong) because:
>
> 1) you can have only one lock per RA, no matter what $LOCKFILE you provide.
> This is because actually not the $LOCKFILE is the lock, but the process ID of
> the shell
>
> 2) the implementation does not guarantee mutual exclusion:
>
> ocf_pidfile_status() is used to query for an unowned lock. ocf_take_lock()
> in turn waits until either the specified lockfile does not exist, or the PID
> in the lockfile vanished.
>
> Then the PID of the RA's shell is written into the lockfile. As can be seen,
> multiple processes can do that if no lock exists.
>
> If you had parallel execution of RAs before, you'll have parallel execution
> even with those "locks".
>
> Finally you can only release the lock using ocf_release_lock_on_exit().
> Unfortunately that function will only release tha last lock passed to that
> function as "trap" does not accumulate the commends you give to it.
>
> Maybe an approach using flock(1) instead might be better (untested, just
> from reading the docs):
>
> lock() {
> (flock -e 123; test -e $LOCKFILE || touch $LOCKFILE) 123> $MASTERLOCKFILE
> }
>
> unlock() {
> (flock -e 124; test -e $LOCKFILE && rm $LOCKFILE) 124> $MASTERLOCKFILE
> }
>
> Regards,
> Ulrich
>
>
> _______________________________________________
> Linux-HA mailing list
> [email protected]
> http://lists.linux-ha.org/mailman/listinfo/linux-ha
> See also: http://linux-ha.org/ReportingProblems
>
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems