From: Dietmar Maurer Date: Wed, 31 Dec 2014 09:07:24 +0000 (+0100) Subject: Daemon: try harder (up to 5 times) to get lock X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=commitdiff_plain;h=3206cdf6778e6389f68f42a889b672f7dcc93ef4 Daemon: try harder (up to 5 times) to get lock --- diff --git a/data/PVE/Daemon.pm b/data/PVE/Daemon.pm index 757c2d1..f03e7cf 100644 --- a/data/PVE/Daemon.pm +++ b/data/PVE/Daemon.pm @@ -35,19 +35,32 @@ $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; my $daemon_initialized = 0; # we only allow one instance +my $close_daemon_lock = sub { + my ($self) = @_; + + close $self->{daemon_lock_fh}; + delete $self->{daemon_lock_fh}; +}; + my $lockpidfile = sub { my ($self) = @_; my $lkfn = $self->{pidfile} . ".lock"; - if (!open (FLCK, ">>$lkfn")) { + $self->{daemon_lock_fh} = IO::File->new(">>$lkfn"); + if (!$self->{daemon_lock_fh}) { my $msg = "can't aquire lock on file '$lkfn' - $!"; syslog ('err', $msg); die "ERROR: $msg\n"; } - if (!flock (FLCK, LOCK_EX|LOCK_NB)) { - close (FLCK); + for (my $i = 0; $i < 5; $i ++) { + return if flock ($self->{daemon_lock_fh}, LOCK_EX|LOCK_NB); + sleep(1); + } + + if (!flock ($self->{daemon_lock_fh}, LOCK_EX|LOCK_NB)) { + &$close_daemon_lock($self); my $msg = "can't aquire lock '$lkfn' - $!"; syslog ('err', $msg); die "ERROR: $msg\n"; @@ -116,7 +129,7 @@ my $start_workers = sub { } else { $0 = "$self->{name} worker"; - close(FLCK); + &$close_daemon_lock($self); PVE::INotify::inotify_close();