From: Dietmar Maurer Date: Mon, 27 Aug 2012 11:41:24 +0000 (+0200) Subject: fix bug 247: retry qmp open X-Git-Url: https://git.proxmox.com/?p=qemu-server.git;a=commitdiff_plain;h=2ae10d4e224b7aaaf44ea1e9a7f8b92cd5da8c96 fix bug 247: retry qmp open --- diff --git a/PVE/QMPClient.pm b/PVE/QMPClient.pm index cc975ab..f8b0dc6 100755 --- a/PVE/QMPClient.pm +++ b/PVE/QMPClient.pm @@ -4,7 +4,10 @@ use strict; #use PVE::SafeSyslog; use PVE::QemuServer; use IO::Multiplex; +use POSIX qw(EINTR EAGAIN); use JSON; +use Time::HiRes qw(usleep gettimeofday tv_interval); + use Data::Dumper; # Qemu Monitor Protocol (QMP) client. @@ -109,8 +112,22 @@ my $open_connection = sub { my $sname = PVE::QemuServer::qmp_socket($vmid); - my $fh = IO::Socket::UNIX->new(Peer => $sname, Blocking => 0, Timeout => 1) || - die "unable to connect to VM $vmid socket - $!\n"; + my $fh; + my $starttime = [gettimeofday]; + my $count = 0; + for (;;) { + $count++; + $fh = IO::Socket::UNIX->new(Peer => $sname, Blocking => 0, Timeout => 1); + last if $fh; + if ($! != EINTR && $! != EAGAIN) { + die "unable to connect to VM $vmid socket - $!\n"; + } + my $elapsed = tv_interval($starttime, [gettimeofday]); + if ($elapsed > 1) { + die "unable to connect to VM $vmid socket - timeout after $count retries\n"; + } + usleep(100000); + } $self->{fhs}->{$vmid} = $fh; $self->{fhs_lookup}->{$fh} = $vmid;