Commit e25f9359 authored by Robert Ricci's avatar Robert Ricci

Changed locking style. Now, if named_setup figures out that some

other process has done the work it was going to (because it started
_after_ this process started trying to grab the lock), it exits.
This way, we avoid doing too much extra work.
parent db7b1f6f
......@@ -62,14 +62,56 @@ use libdb;
#
open(LOCK, ">>$lockfile") || fatal("Couldn't open $lockfile\n");
$count = 0;
while (flock(LOCK, LOCK_EX|LOCK_NB) == 0) {
print "Another named map update in progress. Waiting a moment ...\n";
if ($count++ > 20) {
fatal("Could not get the lock after a long time!\n");
if (flock(LOCK, LOCK_EX|LOCK_NB) == 0) {
#
# If we don't get it the first time, we wait for:
# 1) The lock to become free, in which case we do our thing
# 2) The time on the lock to change, in which case we wait for that process
# to finish
#
my $oldlocktime = (stat(LOCK))[9];
my $gotlock = 0;
while (1) {
print "Another named map update in progress, waiting for it to finish\n";
if (flock(LOCK, LOCK_EX|LOCK_NB) != 0) {
# OK, got the lock, we can do what we're supposed to
$gotlock = 1;
last;
}
$locktime = (stat(LOCK))[9];
if ($locktime != $oldlocktime) {
$oldlocktime = $locktime;
last;
}
if ($count++ > 20) {
fatal("Could not get the lock after a long time!\n");
}
sleep(1);
}
$count = 0;
#
# If we didn't get the lock, wait for the processes that did to finish
#
if (!$gotlock) {
while (((stat(LOCK))[9] != $oldlocktime) &&
(flock(LOCK, LOCK_EX|LOCK_NB) == 0)) {
if ($count++ > 20) {
fatal("Could not get the lock after a long time!\n");
}
sleep(1);
}
exit(0);
}
sleep(1);
}
#
# Perl-style touch(1)
#
my $now = time;
utime $now, $now, $lockfile;
#
# We stick the new map entries into the tail file. First zero it out.
#
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment