selftest: close stdin and wait with waitpid() for a safer exit
authorAndrew Bartlett <abartlet@samba.org>
Fri, 2 Mar 2012 07:20:45 +0000 (18:20 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 2 Mar 2012 11:30:05 +0000 (12:30 +0100)
This avoids timelimit sending kill -9 after 1 second, which may
disrupt the writing of gcov data.

Andrew Bartlett

selftest/target/Samba3.pm
selftest/target/Samba4.pm

index 0ea63db8c422d3bfcdab37fc543e1c7ec4a3614a..c9ad7d31fef743d266995ac3a15efc8f6cfd5c61 100755 (executable)
@@ -43,17 +43,45 @@ sub new($$) {
 sub teardown_env($$)
 {
        my ($self, $envvars) = @_;
+       my $count = 0;
+       
+       # This should cause smbd to terminate gracefully
+       close($envvars->{STDIN_PIPE});
 
        my $smbdpid = read_pid($envvars, "smbd");
        my $nmbdpid = read_pid($envvars, "nmbd");
        my $winbinddpid = read_pid($envvars, "winbindd");
 
+       until (kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+           my $childpid = waitpid(-1, WNOHANG);
+           # This should give it time to write out the gcov data
+           sleep(1);
+           $count++;
+           last if $childpid == 0 or $count > 20;
+       }
+
+       if ($count <= 20) {
+           return;
+       }
+
        $self->stop_sig_term($smbdpid);
        $self->stop_sig_term($nmbdpid);
        $self->stop_sig_term($winbinddpid);
 
-       sleep(2);
+       $count = 0;
+       until (kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+           # if no process sucessfully signalled, then we are done
+           my $childpid = waitpid(-1, WNOHANG);
+           sleep(1);
+           $count++;
+           last if $childpid == 0 or $count > 20;
+       }
+       
+       if ($count <= 10) {
+           return;
+       }
 
+       warn("timelimit process did not quit on SIGTERM, sending SIGKILL");
        $self->stop_sig_kill($smbdpid);
        $self->stop_sig_kill($nmbdpid);
        $self->stop_sig_kill($winbinddpid);
@@ -98,6 +126,8 @@ sub check_env($$)
 {
        my ($self, $envvars) = @_;
 
+       my $childpid = waitpid(-1, WNOHANG);
+
        # TODO ...
        return 1;
 }
index 361152b928d1f6d6769d4faca04d713c734e48c4..b79e29fad62436766009fde27b58de51686bab49 100644 (file)
@@ -1363,10 +1363,12 @@ sub teardown_env($$)
                my $count = 0;
 
                until (kill(0, $pid) == 0) {
+                   my $childpid = waitpid(-1, WNOHANG);
+       
                    # This should give it time to write out the gcov data
                    sleep(1);
                    $count++;
-                   last if $count > 20;
+                   last if $childpid == 0 or $count > 20;
                }
 
                # If it is still around, kill it
@@ -1409,6 +1411,8 @@ sub check_env($$)
 {
        my ($self, $envvars) = @_;
 
+       my $childpid = waitpid(-1, WNOHANG);
+
        return (-p $envvars->{SAMBA_TEST_FIFO});
 }