[pve-devel] r6134 - in pve-common/trunk/data: . PVE

svn-commits at proxmox.com svn-commits at proxmox.com
Tue Jun 21 14:33:17 CEST 2011


Author: dietmar
Date: 2011-06-21 14:33:17 +0200 (Tue, 21 Jun 2011)
New Revision: 6134

Modified:
   pve-common/trunk/data/ChangeLog
   pve-common/trunk/data/PVE/Tools.pm
Log:
use alarm


Modified: pve-common/trunk/data/ChangeLog
===================================================================
--- pve-common/trunk/data/ChangeLog	2011-06-21 09:33:39 UTC (rev 6133)
+++ pve-common/trunk/data/ChangeLog	2011-06-21 12:33:17 UTC (rev 6134)
@@ -1,5 +1,7 @@
 2011-06-21  Proxmox Support Team  <support at proxmox.com>
 
+	* PVE/Tools.pm (run_command): use alarm to impl. timeout
+
 	* PVE/RESTHandler.pm (api_dump): new - used to generate docu
 
 	* PVE/Tools.pm (upid_decode): fix upid parser

Modified: pve-common/trunk/data/PVE/Tools.pm
===================================================================
--- pve-common/trunk/data/PVE/Tools.pm	2011-06-21 09:33:39 UTC (rev 6133)
+++ pve-common/trunk/data/PVE/Tools.pm	2011-06-21 12:33:17 UTC (rev 6134)
@@ -169,13 +169,15 @@
 
     my $errmsg;
     my $laststderr;
+    my $timeout;
+    my $oldtimeout;
+    my $pid;
 
     eval {
 	my $reader = IO::File->new();
 	my $writer = IO::File->new();
 	my $error  = IO::File->new();
 
-	my $timeout;
 	my $input;
 	my $outfunc;
 	my $errfunc;
@@ -207,7 +209,6 @@
  
 	my $orig_pid = $$;
 
-	my $pid;
 	eval {
 	    local $ENV{LANG} = $lang;
 
@@ -228,6 +229,9 @@
 
 	die $err if $err;
 
+	local $SIG{ALRM} = sub { die "got timeout\n"; } if $timeout;
+	$oldtimeout = alarm($timeout) if $timeout;
+
 	print $writer $input if defined $input;
 	close $writer;
 
@@ -238,15 +242,11 @@
 	my $outlog = '';
 	my $errlog = '';
 
+	my $starttime = time();
+
 	while ($select->count) {
-	    my @handles = $select->can_read($timeout);
+	    my @handles = $select->can_read(1);
 
-	    if (defined ($timeout) && (scalar (@handles) == 0)) {
-		kill (9, $pid);
-		waitpid ($pid, 0);
-		die "timeout\n";
-	    }
-
 	    foreach my $h (@handles) {
 		my $buf = '';
 		my $count = sysread ($h, $buf, 4096);
@@ -314,14 +314,24 @@
 	}
 
 	print STDERR "$laststderr\n" if $laststderr;
-
+        alarm(0);
     };
 
     my $err = $@;
 
+    alarm(0);
+
     umask ($old_umask) if defined($old_umask);
 
+    alarm($oldtimeout) if $oldtimeout;
+
     if ($err) {
+	if ($pid && ($err eq "got timeout\n")) {
+	    kill (9, $pid);
+	    waitpid ($pid, 0);
+	    die "command '$cmdstr' failed: $err";
+	}
+
 	if ($errmsg) {
 	    die "$errmsg: $err";
 	} else {



More information about the pve-devel mailing list