selftest: teardown the environments also on getting SIGPIPE
authorStefan Metzmacher <metze@samba.org>
Thu, 10 Jul 2014 12:28:56 +0000 (14:28 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 11 Jul 2014 14:19:07 +0000 (16:19 +0200)
make test uses

selftest.pl | subuntu-filter.py ...

FAIL_IMMEDIATELY=1 lets subuntu-filter.py exit,
which generates SIGPIPE in selftest.pl.

We should handle this just like any other signal
and teardown all environments.

This should make the teardown process more reliable/verbose.

Pair-Programmed-With: Michael Adam <obnox@samba.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
selftest/selftest.pl

index 831ebd90f8d6134efb739a5c1ab76f7358ff2195..fde8451f3ddf7d92e6e395af05fc847fd7159447 100755 (executable)
@@ -64,14 +64,6 @@ my $prefix = "./st";
 my @includes = ();
 my @excludes = ();
 
-sub pipe_handler {
-       my $sig = shift @_;
-       print STDERR "Exiting early because of SIGPIPE.\n";
-       exit(1);
-}
-
-$SIG{PIPE} = \&pipe_handler;
-
 sub find_in_list($$)
 {
        my ($list, $fullname) = @_;
@@ -770,12 +762,24 @@ my @exported_envvars = (
         "GID_RFC2307TEST"
 );
 
-$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { 
+sub sighandler($)
+{
        my $signame = shift;
+
+       $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'DEFAULT';
+       $SIG{PIPE} = 'IGNORE';
+
+       open(STDOUT, ">&STDERR") or die "can't dup STDOUT to STDERR: $!";
+
+       print "$0: PID[$$]: Got SIG${signame} teardown environments.\n";
        teardown_env($_) foreach(keys %running_envs);
-       die("Received signal $signame");
+       system("pstree -p $$");
+       print "$0: PID[$$]: Exiting...\n";
+       exit(1);
 };
 
+$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = $SIG{PIPE} = \&sighandler;
+
 sub setup_env($$)
 {
        my ($name, $prefix) = @_;
@@ -871,6 +875,7 @@ sub teardown_env($)
 {
        my ($envname) = @_;
        return if ($envname eq "none");
+       print STDERR "teardown_env($envname)\n";
        my $env = get_running_env($envname);
        $env->{target}->teardown_env($env);
        delete $running_envs{$envname};