[libserver-starter-perl] 01/04: Add patches from CPAN RT#73711 to fix test failures
gregor herrmann
gregoa at debian.org
Sun Jun 29 16:34:39 UTC 2014
This is an automated email from the git hooks/post-receive script.
gregoa pushed a commit to branch master
in repository libserver-starter-perl.
commit 15d11b88fdd4ed1b29e0521efc5b1426f59eaac1
Author: gregor herrmann <gregoa at debian.org>
Date: Sun Jun 29 18:27:30 2014 +0200
Add patches from CPAN RT#73711 to fix test failures
caused by races/timing issues.
Closes: #753039
---
.../0001-Synchronize-to-PID-in-t-07-envdir.t.patch | 89 +++++++++++++++++
debian/patches/0002-Fix-loading-envdir.patch | 107 +++++++++++++++++++++
debian/patches/series | 2 +
3 files changed, 198 insertions(+)
diff --git a/debian/patches/0001-Synchronize-to-PID-in-t-07-envdir.t.patch b/debian/patches/0001-Synchronize-to-PID-in-t-07-envdir.t.patch
new file mode 100644
index 0000000..c71590d
--- /dev/null
+++ b/debian/patches/0001-Synchronize-to-PID-in-t-07-envdir.t.patch
@@ -0,0 +1,89 @@
+From 9fc8c81a018ba6cb5f3f0ad3fbc836e301468978 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar at redhat.com>
+Date: Mon, 16 Jun 2014 15:20:43 +0200
+Subject: [PATCH 1/2] Synchronize to PID in t/07-envdir.t
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The t/07-envdir.t used various sleeps to deal with races. This broke obviously
+when the timing was abnormal like on have loaded machine. This patch
+synchronizes on the status file by checking only the new worker is
+running.
+
+Similar to CPAN RT#73711.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ t/07-envdir-print.pl | 3 ++-
+ t/07-envdir.t | 29 ++++++++++++++++++++++++++---
+ 2 files changed, 28 insertions(+), 4 deletions(-)
+
+diff --git a/t/07-envdir-print.pl b/t/07-envdir-print.pl
+index 22cb01a..fb14225 100755
+--- a/t/07-envdir-print.pl
++++ b/t/07-envdir-print.pl
+@@ -11,6 +11,7 @@ use Server::Starter qw(server_ports);
+ $SIG{TERM} = $SIG{USR1} = sub {
+ exit 0;
+ };
++$ENV{PID} = $$;
+
+ my $listener = IO::Socket::INET->new(
+ Proto => 'tcp',
+@@ -21,7 +22,7 @@ $listener->fdopen((values %{server_ports()})[0], 'w')
+ while (1) {
+ if (my $conn = $listener->accept) {
+ my $s = "";
+- for my $envkey (keys %ENV) {
++ for my $envkey (sort keys %ENV) {
+ $s .= $envkey . "=" . $ENV{$envkey} . "\n";
+ }
+ $conn->syswrite($s);
+diff --git a/t/07-envdir.t b/t/07-envdir.t
+index 8bf2352..2050706 100644
+--- a/t/07-envdir.t
++++ b/t/07-envdir.t
+@@ -46,13 +46,36 @@ test_tcp(
+ $buf;
+ };
+ my $restart = sub {
+- sleep 1;
++ sub getstatus {
++ my ($file, $value);
++ open($file, '<', "$tempdir/status") or return '';
++ do { local $/ = undef; $value = <$file>; };
++ close $file;
++ $value // '';
++ }
++ sub getsinglegeneration {
++ my $status;
++ do {
++ sleep 1 if defined $status;
++ $status = getstatus;
++ } until ($status =~ /\A\d+:\d+\n\z/);
++ chomp $status;
++ $status;
++ }
++ my $previous_generation = getsinglegeneration;
+ kill "HUP", $server_pid;
+- sleep 2;
++ my $current_generation;
++ while (($current_generation = getsinglegeneration) eq
++ $previous_generation) {
++ sleep 1;
++ }
++ diag "Server changed from <$previous_generation> ",
++ "to <$current_generation>\n";
+ };
+ # Initial worker does not read envdir
+ my $buf = $fetch_env->();
+- unlike($buf, qr/^FOO=foo-value1$/m, 'changed env');
++ unlike($buf, qr/^FOO=foo-value1$/m,
++ 'environment not read for the first time');
+ # rewrite envdir
+ open my $envfh, ">", "$tempdir/env/FOO" or die $!;
+ print $envfh "foo-value2";
+--
+1.9.3
+
diff --git a/debian/patches/0002-Fix-loading-envdir.patch b/debian/patches/0002-Fix-loading-envdir.patch
new file mode 100644
index 0000000..d0b9dbf
--- /dev/null
+++ b/debian/patches/0002-Fix-loading-envdir.patch
@@ -0,0 +1,107 @@
+From 6d965848ff8905f82da0f1ac142000b12a05905e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar at redhat.com>
+Date: Mon, 16 Jun 2014 17:25:08 +0200
+Subject: [PATCH 2/2] Fix loading envdir
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The envdir was scanned each second regardless of signal received. This
+caused random failures of the 'removed env' t/07-envdir.t test.
+
+This patch fixes it by loading the environment only just before
+intended restart. It also documents this start_server() option.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ lib/Server/Starter.pm | 31 ++++++++++++++++++++++---------
+ 1 file changed, 22 insertions(+), 9 deletions(-)
+
+diff --git a/lib/Server/Starter.pm b/lib/Server/Starter.pm
+index 47bc18a..c171307 100644
+--- a/lib/Server/Starter.pm
++++ b/lib/Server/Starter.pm
+@@ -179,15 +179,13 @@ sub start_server {
+
+ # the main loop
+ my $term_signal = 0;
+- $current_worker = _start_worker($opts);
++ my %loaded_env;
++ $current_worker = _start_worker($opts, \%loaded_env);
+ $update_status->();
+ my $auto_restart_interval = 0;
+ my $last_restart_time = time();
+ my $restart_flag = 0;
+ while (1) {
+- my %loaded_env = _reload_env();
+- my @loaded_env_keys = keys %loaded_env;
+- local @ENV{@loaded_env_keys} = map { $loaded_env{$_} } (@loaded_env_keys);
+ if ($ENV{ENABLE_AUTO_RESTART}) {
+ # restart workers periodically
+ $auto_restart_interval = $ENV{AUTO_RESTART_INTERVAL} ||= 360;
+@@ -201,7 +199,7 @@ sub start_server {
+ last if ($died_worker <= 0);
+ if ($died_worker == $current_worker) {
+ print STDERR "worker $died_worker died unexpectedly with status:$status, restarting\n";
+- $current_worker = _start_worker($opts);
++ $current_worker = _start_worker($opts, \%loaded_env);
+ $last_restart_time = time();
+ } else {
+ print STDERR "old worker $died_worker died, status:$status\n";
+@@ -232,9 +230,10 @@ sub start_server {
+ }
+ }
+ if ($restart_flag > 1 || ($restart_flag > 0 && $num_old_workers == 0)) {
++ %loaded_env = _reload_env();
+ print STDERR "spawning a new worker (num_old_workers=$num_old_workers)\n";
+ $old_workers{$current_worker} = $ENV{SERVER_STARTER_GENERATION};
+- $current_worker = _start_worker($opts);
++ $current_worker = _start_worker($opts, \%loaded_env);
+ $last_restart_time = time();
+ $restart_flag = 0;
+ $update_status->();
+@@ -342,7 +341,7 @@ sub _reload_env {
+ }
+
+ sub _start_worker {
+- my $opts = shift;
++ my ($opts, $loaded_env) = @_;
+ my $pid;
+ while (1) {
+ $ENV{SERVER_STARTER_GENERATION}++;
+@@ -350,6 +349,8 @@ sub _start_worker {
+ die "fork(2) failed:$!"
+ unless defined $pid;
+ if ($pid == 0) {
++ my @loaded_env_keys = keys %$loaded_env;
++ @ENV{@loaded_env_keys} = map { $loaded_env->{$_} } (@loaded_env_keys);
+ my @args = @{$opts->{exec}};
+ # child process
+ if (defined $opts->{dir}) {
+@@ -418,9 +419,21 @@ A Net::Server personality that can be run under L<Server::Starter> exists under
+
+ Returns zero or more file descriptors on which the server program should call accept(2) in a hashref. Each element of the hashref is: (host:port|port|path_of_unix_socket) => file_descriptor.
+
+-=item start_server
++=item start_server(%options)
+
+-Starts the superdaemon. Used by the C<start_server> script.
++Starts the superdaemon. Used by the C<start_server> script. Options are:
++
++=over 4
++
++=item envdir
++
++Defines a directory whose content is added into server's environment. Each file name specifies an environment variable, the file's content specifies a value of the environment variable. Files with names starting with a dot are ignored.
++
++The environment directory is scanned and read only on time-based autorestart or SIGHUP signal. The first server instances have default environment. To remove an enviroment variable added before, remove the file and send the signal.
++
++This option is not mandatory.
++
++=back
+
+ =back
+
+--
+1.9.3
+
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..589272a
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,2 @@
+0001-Synchronize-to-PID-in-t-07-envdir.t.patch
+0002-Fix-loading-envdir.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libserver-starter-perl.git
More information about the Pkg-perl-cvs-commits
mailing list