bump to git master once more with merged (updated) PR #534
parent
d3cd75b261
commit
a89e8f0b47
@ -1,376 +0,0 @@
|
||||
From 9f3ee6aa451470ca258e5452171c801b096ef7d2 Mon Sep 17 00:00:00 2001
|
||||
From: Stephan Kulow <coolo@suse.de>
|
||||
Date: Sat, 9 Jul 2016 17:54:29 +0200
|
||||
Subject: [PATCH 1/2] Rework how exit status of isotovideo is calculated
|
||||
|
||||
The signalling between the processes needs more care
|
||||
---
|
||||
autotest.pm | 6 +++++
|
||||
backend/baseclass.pm | 2 +-
|
||||
backend/driver.pm | 4 +---
|
||||
commands.pm | 5 ++++
|
||||
isotovideo | 68 ++++++++++++++++++++++++++++++++++++----------------
|
||||
myjsonrpc.pm | 11 +++++++--
|
||||
6 files changed, 70 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/autotest.pm b/autotest.pm
|
||||
index 6acc443..766bd42 100644
|
||||
--- a/autotest.pm
|
||||
+++ b/autotest.pm
|
||||
@@ -116,6 +116,7 @@ sub run_all {
|
||||
warn $@;
|
||||
$r = 1;
|
||||
}
|
||||
+ myjsonrpc::send_json($isotovideo, {cmd => 'tests_done', ret => $r});
|
||||
close $isotovideo;
|
||||
_exit(0);
|
||||
}
|
||||
@@ -138,6 +139,11 @@ sub start_process {
|
||||
die "cannot fork: $!" unless defined $testpid;
|
||||
close $child;
|
||||
|
||||
+ $SIG{TERM} = 'DEFAULT';
|
||||
+ $SIG{INT} = 'DEFAULT';
|
||||
+ $SIG{HUP} = 'DEFAULT';
|
||||
+ $SIG{CHLD} = 'DEFAULT';
|
||||
+
|
||||
$0 = "$0: autotest";
|
||||
my $line = <$isotovideo>;
|
||||
if (!$line) {
|
||||
diff --git a/backend/baseclass.pm b/backend/baseclass.pm
|
||||
index 87ad721..79deb47 100644
|
||||
--- a/backend/baseclass.pm
|
||||
+++ b/backend/baseclass.pm
|
||||
@@ -271,7 +271,7 @@ sub alive {
|
||||
}
|
||||
else {
|
||||
bmwqemu::diag("ALARM: backend.run got deleted! - exiting...");
|
||||
- alarm 3;
|
||||
+ _exit(1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
diff --git a/backend/driver.pm b/backend/driver.pm
|
||||
index c9d620e..5ed377f 100644
|
||||
--- a/backend/driver.pm
|
||||
+++ b/backend/driver.pm
|
||||
@@ -70,13 +70,11 @@ sub start {
|
||||
die "fork failed" unless defined $pid;
|
||||
|
||||
if ($pid == 0) {
|
||||
- $SIG{ALRM} = 'DEFAULT';
|
||||
$SIG{TERM} = 'DEFAULT';
|
||||
$SIG{INT} = 'DEFAULT';
|
||||
$SIG{HUP} = 'DEFAULT';
|
||||
$SIG{CHLD} = 'DEFAULT';
|
||||
-
|
||||
- $0 = "$0: backend";
|
||||
+ $0 = "$0: backend";
|
||||
$self->{backend}->run(fileno($self->{from_parent}), fileno($self->{to_parent}));
|
||||
_exit(0);
|
||||
}
|
||||
diff --git a/commands.pm b/commands.pm
|
||||
index e602735..3562fdf 100644
|
||||
--- a/commands.pm
|
||||
+++ b/commands.pm
|
||||
@@ -281,6 +281,11 @@ sub start_server {
|
||||
die "fork failed" unless defined $pid;
|
||||
|
||||
if ($pid == 0) {
|
||||
+ $SIG{TERM} = 'DEFAULT';
|
||||
+ $SIG{INT} = 'DEFAULT';
|
||||
+ $SIG{HUP} = 'DEFAULT';
|
||||
+ $SIG{CHLD} = 'DEFAULT';
|
||||
+
|
||||
close($child);
|
||||
$0 = "$0: commands";
|
||||
run_daemon($port);
|
||||
diff --git a/isotovideo b/isotovideo
|
||||
index e76f806..167730c 100755
|
||||
--- a/isotovideo
|
||||
+++ b/isotovideo
|
||||
@@ -45,6 +45,7 @@ use testapi qw(diag);
|
||||
use Getopt::Std;
|
||||
require IPC::System::Simple;
|
||||
use autodie qw(:all);
|
||||
+no autodie qw(kill);
|
||||
use Cwd;
|
||||
use POSIX qw(:sys_wait_h _exit);
|
||||
use Carp qw(cluck);
|
||||
@@ -80,24 +81,30 @@ die "No scripts in $bmwqemu::vars{CASEDIR}" if !-e "$bmwqemu::vars{CASEDIR}";
|
||||
my $cpid;
|
||||
my $cfd;
|
||||
|
||||
+my $loop = 1;
|
||||
+
|
||||
# all so ugly ...
|
||||
sub signalhandler {
|
||||
|
||||
my ($sig) = @_;
|
||||
- diag("$$: signalhandler got $sig");
|
||||
+ diag("signalhandler got $sig - loop $loop");
|
||||
+ if ($loop) {
|
||||
+ $loop = 0;
|
||||
+ return;
|
||||
+ }
|
||||
bmwqemu::stop_vm();
|
||||
if (defined $bmwqemu::backend && $bmwqemu::backend->{backend_pid}) {
|
||||
- diag("$$: killing backend process $bmwqemu::backend->{backend_pid}");
|
||||
+ diag("killing backend process $bmwqemu::backend->{backend_pid}");
|
||||
kill('SIGTERM', $bmwqemu::backend->{backend_pid});
|
||||
waitpid($bmwqemu::backend->{backend_pid}, 0);
|
||||
- diag("$$: done with backend process");
|
||||
+ diag("done with backend process");
|
||||
$bmwqemu::backend->{backend_pid} = 0;
|
||||
}
|
||||
if (defined $cpid) {
|
||||
- diag("$$: killing commands process $cpid");
|
||||
+ diag("killing commands process $cpid");
|
||||
kill('SIGTERM', $cpid);
|
||||
waitpid($cpid, 0);
|
||||
- diag("$$: done joining commands process");
|
||||
+ diag("done joining commands process");
|
||||
$cpid = 0;
|
||||
}
|
||||
_exit(1);
|
||||
@@ -105,19 +112,23 @@ sub signalhandler {
|
||||
|
||||
sub signalhandler_chld {
|
||||
|
||||
- diag("$$: got sigchld");
|
||||
+ diag("got sigchld");
|
||||
|
||||
while ((my $child = waitpid(-1, WNOHANG)) > 0) {
|
||||
if ($child == $cpid) {
|
||||
- diag("$$: commands webserver died");
|
||||
+ diag("commands webserver died");
|
||||
+ $loop = 0;
|
||||
$cpid = 0;
|
||||
+ next;
|
||||
}
|
||||
if ($bmwqemu::backend->{backend_pid} && $child == $bmwqemu::backend->{backend_pid}) {
|
||||
- diag("$$: backend $child died");
|
||||
+ diag("backend $child died");
|
||||
$bmwqemu::backend->{backend_pid} = 0;
|
||||
$bmwqemu::backend->{to_child} = undef;
|
||||
$bmwqemu::backend->{from_child} = undef;
|
||||
+ next;
|
||||
}
|
||||
+ diag("unknown child $child died");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,7 +153,6 @@ sub calculate_git_hash {
|
||||
return $test_git_hash;
|
||||
}
|
||||
|
||||
-$SIG{ALRM} = \&signalhandler;
|
||||
$SIG{TERM} = \&signalhandler;
|
||||
$SIG{INT} = \&signalhandler;
|
||||
$SIG{HUP} = \&signalhandler;
|
||||
@@ -215,8 +225,6 @@ my $needinput = 0;
|
||||
|
||||
my $current_test_name;
|
||||
|
||||
-my $loop = 1;
|
||||
-
|
||||
# timeout for the select (only set for check_screens)
|
||||
my $timeout = undef;
|
||||
|
||||
@@ -263,6 +271,8 @@ sub check_asserted_screen {
|
||||
}
|
||||
}
|
||||
|
||||
+my $r = 0;
|
||||
+
|
||||
while ($loop) {
|
||||
my ($reads, $writes, $exceps) = IO::Select::select($s, undef, $s, $timeout);
|
||||
for my $r (@$reads) {
|
||||
@@ -291,6 +301,17 @@ while ($loop) {
|
||||
myjsonrpc::send_json($r, {ret => 1});
|
||||
next;
|
||||
}
|
||||
+ if ($rsp->{cmd} eq 'tests_done') {
|
||||
+ $r = $rsp->{ret};
|
||||
+ close($testfd);
|
||||
+ $testfd = undef;
|
||||
+ kill('SIGTERM', $testpid);
|
||||
+ diag "awaiting death of test process $testpid";
|
||||
+ my $ret = waitpid($testpid, 0);
|
||||
+ diag "test process $testpid exited";
|
||||
+ $loop = 0;
|
||||
+ next;
|
||||
+ }
|
||||
if ($rsp->{cmd} eq 'check_screen') {
|
||||
my $mustmatch = $rsp->{mustmatch};
|
||||
my $timeout = $rsp->{timeout};
|
||||
@@ -358,28 +379,33 @@ while ($loop) {
|
||||
check_asserted_screen;
|
||||
}
|
||||
}
|
||||
-close $testfd;
|
||||
-kill('SIGTERM', $testpid);
|
||||
-diag "awaiting death of testpid $testpid";
|
||||
-waitpid($testpid, 0);
|
||||
|
||||
-my $r = 0;
|
||||
+if ($testfd) {
|
||||
+ $r = 1; # unusual shutdown
|
||||
+ close $testfd;
|
||||
+ kill('SIGTERM', $testpid);
|
||||
+ diag "awaiting death of testpid $testpid";
|
||||
+ my $ret = waitpid($testpid, 0);
|
||||
+ diag "test process exited: $ret";
|
||||
+}
|
||||
+
|
||||
diag "isotovideo done" unless $r;
|
||||
diag "FAIL" if $r;
|
||||
|
||||
my $clean_shutdown;
|
||||
eval {
|
||||
- my $status = $bmwqemu::backend->status();
|
||||
+ my $status = $bmwqemu::backend->_send_json({cmd => 'status'});
|
||||
+ diag "BACKEND STATUS $status\n";
|
||||
$clean_shutdown = 1 if $status || '' eq "shutdown";
|
||||
};
|
||||
|
||||
bmwqemu::stop_vm();
|
||||
-diag "killing commands process";
|
||||
if ($cpid) {
|
||||
+ diag "killing commands process";
|
||||
kill('SIGTERM', $cpid);
|
||||
- waitpid($cpid, 0);
|
||||
+ my $ret = waitpid($cpid, 0);
|
||||
+ diag "commands process exited: $ret";
|
||||
}
|
||||
-diag "done joining commands process";
|
||||
|
||||
# mark hard disks for upload if test finished
|
||||
if (!$r && (my $nd = $bmwqemu::vars{NUMDISKS})) {
|
||||
@@ -400,6 +426,7 @@ if (!$r && (my $nd = $bmwqemu::vars{NUMDISKS})) {
|
||||
}
|
||||
if (@toextract && !$clean_shutdown) {
|
||||
diag "ERROR: Machine not shut down when uploading disks!\n";
|
||||
+ $r = 1;
|
||||
}
|
||||
else {
|
||||
for my $asset (@toextract) {
|
||||
@@ -408,5 +435,6 @@ if (!$r && (my $nd = $bmwqemu::vars{NUMDISKS})) {
|
||||
}
|
||||
}
|
||||
|
||||
+print "EXIT $r\n";
|
||||
exit $r;
|
||||
# vim: set sw=4 et:
|
||||
diff --git a/myjsonrpc.pm b/myjsonrpc.pm
|
||||
index 505ea5f..374574a 100644
|
||||
--- a/myjsonrpc.pm
|
||||
+++ b/myjsonrpc.pm
|
||||
@@ -19,6 +19,7 @@ use strict;
|
||||
use warnings;
|
||||
use Carp qw(cluck confess);
|
||||
use bmwqemu ();
|
||||
+use Errno;
|
||||
|
||||
sub send_json {
|
||||
my ($to_fd, $cmd) = @_;
|
||||
@@ -64,7 +65,7 @@ sub read_json {
|
||||
# remember the trailing text
|
||||
$sockets->{$fd} = $JSON->incr_text();
|
||||
if ($hash->{QUIT}) {
|
||||
- print "received magic close\n";
|
||||
+ bmwqemu::diag("received magic close");
|
||||
return;
|
||||
}
|
||||
return $hash;
|
||||
@@ -74,7 +75,13 @@ sub read_json {
|
||||
my @res = $s->can_read;
|
||||
unless (@res) {
|
||||
my $E = $!; # save the error
|
||||
- confess "ERROR: timeout reading JSON reply: $E\n";
|
||||
+ unless ($!{EINTR}) { # EINTR if killed
|
||||
+ confess "ERROR: timeout reading JSON reply: $E\n";
|
||||
+ }
|
||||
+ else {
|
||||
+ bmwqemu::diag("can_read received kill signal");
|
||||
+ }
|
||||
+ return;
|
||||
}
|
||||
|
||||
my $qbuffer;
|
||||
|
||||
From 4485a511c5e0840eccca21c5be659c2f309b9cd9 Mon Sep 17 00:00:00 2001
|
||||
From: Stephan Kulow <coolo@suse.de>
|
||||
Date: Sun, 10 Jul 2016 11:59:00 +0200
|
||||
Subject: [PATCH 2/2] Make sure the opencv threads only run in the backend
|
||||
|
||||
That opencv creates threads in our back confuses PERL when delivering
|
||||
signals, so we need to double catch the problem by only initiing
|
||||
cv in the forked children and avoiding IPC::Simple (via autodie)
|
||||
in isotovideo
|
||||
---
|
||||
autotest.pm | 4 ++++
|
||||
backend/qemu.pm | 3 ++-
|
||||
bmwqemu.pm | 6 ------
|
||||
3 files changed, 6 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/autotest.pm b/autotest.pm
|
||||
index 766bd42..c90844b 100644
|
||||
--- a/autotest.pm
|
||||
+++ b/autotest.pm
|
||||
@@ -25,6 +25,7 @@ use File::Spec;
|
||||
use Socket;
|
||||
use IO::Handle;
|
||||
use POSIX qw(_exit);
|
||||
+use cv;
|
||||
|
||||
our %tests; # scheduled or run tests
|
||||
our @testorder; # for keeping them in order
|
||||
@@ -144,6 +145,9 @@ sub start_process {
|
||||
$SIG{HUP} = 'DEFAULT';
|
||||
$SIG{CHLD} = 'DEFAULT';
|
||||
|
||||
+ cv::init;
|
||||
+ require tinycv;
|
||||
+
|
||||
$0 = "$0: autotest";
|
||||
my $line = <$isotovideo>;
|
||||
if (!$line) {
|
||||
diff --git a/backend/qemu.pm b/backend/qemu.pm
|
||||
index 869ccbd..71b9203 100644
|
||||
--- a/backend/qemu.pm
|
||||
+++ b/backend/qemu.pm
|
||||
@@ -173,7 +173,8 @@ sub load_snapshot {
|
||||
|
||||
sub runcmd {
|
||||
diag "running " . join(' ', @_);
|
||||
- return system(@_);
|
||||
+ local $SIG{CHLD} = 'IGNORE';
|
||||
+ return CORE::system(@_);
|
||||
}
|
||||
|
||||
sub do_extract_assets {
|
||||
diff --git a/bmwqemu.pm b/bmwqemu.pm
|
||||
index a02e540..75109b5 100755
|
||||
--- a/bmwqemu.pm
|
||||
+++ b/bmwqemu.pm
|
||||
@@ -20,9 +20,6 @@ use warnings;
|
||||
use Time::HiRes qw(sleep gettimeofday);
|
||||
use IO::Socket;
|
||||
|
||||
-use ocr;
|
||||
-use cv;
|
||||
-use needle;
|
||||
use Thread::Queue;
|
||||
use POSIX;
|
||||
use Term::ANSIColor;
|
||||
@@ -125,9 +122,6 @@ sub init {
|
||||
$| = 1;
|
||||
select($oldfh);
|
||||
|
||||
- cv::init();
|
||||
- require tinycv;
|
||||
-
|
||||
die "DISTRI undefined\n" . pp(\%vars) . "\n" unless $vars{DISTRI};
|
||||
|
||||
unless ($vars{CASEDIR}) {
|
Loading…
Reference in new issue