[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