]> xenbits.xensource.com Git - people/dariof/osstest.git/commitdiff
TestSupport: use timeout(1)
authorIan Jackson <ian.jackson@eu.citrix.com>
Mon, 8 Dec 2014 12:10:24 +0000 (12:10 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 8 Dec 2014 14:41:48 +0000 (14:41 +0000)
If a command we run times out, the machinery in cmd() will arrange
for the ts-* script to spot the timeout, and stop waiting for it.

However it is also necessary for the command we ran to die.  It has a
copy of the owner daemon fd, so if it doesn't, our resources won't get
freed.  In sufficiently exciting bugs, our allocation might continue
indefinitely, while a subprocess of ours hangs on after we are long
gone.

timeout(1) does not print a message when the process times out (!)  So
we can't do away with the logic in cmd().  We set the timeout(1)
timeout to 30s more than our own timeout, so that cmd() will time
out first and print a message.

We could use alarm(1) as we do in Osstest/Serial/sympathy.pm but that
program isn't packaged and its unsophisticated approach is not really
appropriate for arbitrary nonconsenting programs.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Osstest/TestSupport.pm

index a3b69367d690305d649e5986eb46acbd2d2ce39f..ca680c0226d5c25d322e533f704adc701a267698 100644 (file)
@@ -388,7 +388,10 @@ sub sshopts () {
 sub tcmdex {
     my ($timeout,$stdout,$cmd,$optsref,@args) = @_;
     logm("executing $cmd ... @args");
-    my $r= cmd($timeout,$stdout, $cmd,@$optsref,@args);
+    # We use timeout(1) as a backstop, in case $cmd doesn't die.  We
+    # need $cmd to die because we won't release the resources we own
+    # until all of our children are dead.
+    my $r= cmd($timeout,$stdout, 'timeout',$timeout+30, $cmd,@$optsref,@args);
     $r and die "status $r";
 }