From d6bebc8c25e9512ded8fcb6bf6f8a1339f31f1a4 Mon Sep 17 00:00:00 2001 From: Kohei TANUMA Date: Sat, 23 May 2009 18:51:31 +0900 Subject: [PATCH] Fix some bugs of l7directord. Aboid zombies when using custom health check. Fix sorryserver remove. Wait for process to stop when using stop, restart, try-restart command. --- l7directord/l7directord | 36 ++++++++++++++++++----------------- l7directord/t/01_main.t | 48 +++++++++++++++++++++++++++++++++++++++++++++-- l7directord/t/02_cmd.t | 9 ++++++++- l7directord/t/05_config.t | 8 +++++--- 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/l7directord/l7directord b/l7directord/l7directord index d3e0f7d..59445a5 100755 --- a/l7directord/l7directord +++ b/l7directord/l7directord @@ -108,7 +108,7 @@ our %VIRTUAL = ( maxconn => 0, qosup => 0, qosdown => 0, - sorryserver => undef, + sorryserver => { ip => '0.0.0.0', port => 0 }, request => undef, receive => undef, httpmethod => 'GET', @@ -297,9 +297,9 @@ sub initial_setting { sub search_config_file { my $config_file = undef; my @search_path = qw( - ./l7directord.cf - /etc/ha.d/l7directord.cf /etc/ha.d/conf/l7directord.cf + /etc/ha.d/l7directord.cf + ./l7directord.cf ); if (@ARGV) { @@ -328,9 +328,9 @@ sub search_config_file { sub search_l7vsadm_file { my $l7vsadm_file = undef; my @search_path = qw( - ./l7vsadm /usr/sbin/l7vsadm /sbin/l7vsadm + ./l7vsadm ); for my $file (@search_path) { @@ -411,20 +411,23 @@ sub cmd_stop { print {*STDERR} _message('WRN0003', $oldpid); return 3; } + + # wait and see + while (1) { + read_pid() or last; + sleep 1; + } return 0; } # cmd_restart # Restart process -# Called if command argument is try-restart +# Called if command argument is restart # return: see cmd_start return sub cmd_restart { # stop and ignore result cmd_stop(); - # wait for pid file - sleep 1; - # start my $status = cmd_start(); @@ -444,9 +447,6 @@ sub cmd_try_restart { return $stop_result; } - # wait for pid file - sleep 1; - # start my $status = cmd_start(); @@ -1783,8 +1783,6 @@ sub check_child_process { push @down_process_ids, $id; next; } - # non-blocking wait for zombie process - waitpid(-1, WNOHANG); # TODO should move to sigchld handler? # signal 0 my $signaled = kill 0, $HEALTH_CHECK{$id}{pid}; if ($signaled != 1) { @@ -1913,6 +1911,9 @@ sub sleep_and_check_signal { my $sleeped = 0; while ($sec > $sleeped) { + # non-blocking wait for zombie process + waitpid(-1, WNOHANG); # TODO should move to sigchld handler? + if ($is_child) { if ( defined $PROC_STAT{halt} ) { ld_log( _message( 'WRN0001', $CONFIG_FILE{path}, $PROC_STAT{halt} ) ); @@ -2060,7 +2061,7 @@ sub make_custom_func { local $SIG{__DIE__} = 'DEFAULT'; local $SIG{ALRM} = sub { die "custom check timeout\n"; }; eval { - alarm $v->{negotiatetimeout}; + alarm $v->{checktimeout}; $res = system_wrapper($customcheck); alarm 0; }; @@ -3756,7 +3757,7 @@ sub ld_getservbyname { return $name; } - my $port = ( getservbyname($name, $protocol) )[2] or return; + my $port = ( getservbyname($name, $protocol) )[2]; return $port; } @@ -3782,8 +3783,9 @@ sub ld_gethostservbyname { } my $ip = $1; my $port = $2; - $ip = ld_gethostbyname($ip) or return; - $port = ld_getservbyname($port, $protocol) or return; + $ip = ld_gethostbyname($ip) or return; + $port = ld_getservbyname($port, $protocol); + return if !defined $port; return {ip => $ip, port => $port}; } diff --git a/l7directord/t/01_main.t b/l7directord/t/01_main.t index f92e75c..be43915 100644 --- a/l7directord/t/01_main.t +++ b/l7directord/t/01_main.t @@ -109,19 +109,36 @@ SKIP: { SKIP: { my $fail = 0; my $made = 0; + my $bak2 = 0; + my $bak3 = 0; if (!-f './l7directord.cf') { if (!open my $f, '>', './l7directord.cf') { $fail = 1; } else { $made = 1; close $f; } } + if (!$fail && -f '/etc/ha.d/conf/l7directord.cf') { + if (move '/etc/ha.d/conf/l7directord.cf', 'l7d.bak2') { + $bak2 = 1; + } else { + $fail = 1; + } + } + if (!$fail && -f '/etc/ha.d/l7directord.cf') { + if (move '/etc/ha.d/l7directord.cf', 'l7d.bak3') { + $bak3 = 1; + } else { + $fail = 1; + } + } if ($fail) { - if ($made) { unlink './l7directord.cf'; } skip 'cannot make ./l7directord.cf', 3; } test_argv('ARGV="reload"', 5, qw(reload)); is $main::CONFIG_FILE{path}, abs_path('./l7directord.cf'), 'search config path(1)'; is $main::CONFIG_FILE{filename}, 'l7directord', 'search config filename'; if ($made) { unlink './l7directord.cf'; } + if ($bak2) { move 'l7d.bak2', '/etc/ha.d/conf/l7directord.cf'; } + if ($bak3) { move 'l7d.bak3', '/etc/ha.d/l7directord.cf'; } } SKIP: { @@ -249,16 +266,43 @@ SKIP: { SKIP: { my $fail = 0; my $made = 0; + my $bak2 = 0; + my $bak3 = 0; if (!-f './l7vsadm') { if (!open my $f, '>', './l7vsadm') { $fail = 1; } else { $made = 1; close $f; } } - if (!-x './l7vsadm') { + if (!$fail && !-x './l7vsadm') { if (!chmod 0755, './l7vsadm') { $fail = 1; } } + if (!$fail && -f '/usr/sbin/l7vsadm') { + if (move '/usr/sbin/l7vsadm', 'l7v.bak2') { + $bak2 = 1; + } else { + $fail = 1; + } + } + if (!$fail && -f '/sbin/l7vsadm') { + if (move '/sbin/l7vsadm', 'l7v.bak3') { + $bak3 = 1; + } else { + $fail = 1; + } + } + if ($fail) { + if ($bak2) { + move 'l7v.bak2', '/usr/sbin/l7vsadm'; + chmod '0755', '/usr/sbin/l7vsadm'; + } + if ($bak3) { + move 'l7v.bak3', '/sbin/l7vsadm'; + chmod '0755', '/sbin/l7vsadm'; + } + skip 'cannot make ./l7vsadm', 2; + } skip 'cannot make ./l7vsadm', 2 if ($fail); test_argv('ARGV="stop"', 2, qw(stop)); is $main::PROC_ENV{l7vsadm}, abs_path('./l7vsadm'), 'search l7vsadm(1)'; diff --git a/l7directord/t/02_cmd.t b/l7directord/t/02_cmd.t index d878df4..f869872 100644 --- a/l7directord/t/02_cmd.t +++ b/l7directord/t/02_cmd.t @@ -14,6 +14,7 @@ default_value(); our $signal = undef; our $read_config_called = 0; our $ld_log_called = 0; +our @read_pid_return_first = (); our @read_pid_return = (); our @children_command = (); our $system_command = undef; @@ -138,7 +139,8 @@ open *STDERR, '>', '/dev/null'; } { local $SIG{TERM} = sub { $signal = shift; }; - local @read_pid_return = ($$); + local @read_pid_return_first = ($$); + local @read_pid_return; my $got = cmd_stop(); is $got, 0, 'cmd_stop - running'; is $signal, 'TERM', 'cmd_stop - signal send'; @@ -337,6 +339,11 @@ sub __ld_setup { $ld_setup_called++; } sub __read_pid { + if (@read_pid_return_first) { + my @return = @read_pid_return_first; + undef @read_pid_return_first; + return wantarray ? @return : $return[0]; + } return wantarray ? @read_pid_return : $read_pid_return[0]; } sub __write_pid { diff --git a/l7directord/t/05_config.t b/l7directord/t/05_config.t index 251bd85..49ea81a 100644 --- a/l7directord/t/05_config.t +++ b/l7directord/t/05_config.t @@ -175,7 +175,7 @@ CONFIG 'virtualhost' => undef, 'quiescent' => undef, 'realrecovercallback' => undef, - 'sorryserver' => undef, + 'sorryserver' => { ip => '0.0.0.0', port => 0 }, 'service' => undef, 'login' => '', 'fallback' => undef, @@ -206,7 +206,7 @@ CONFIG 'virtualhost' => undef, 'quiescent' => undef, 'realrecovercallback' => undef, - 'sorryserver' => undef, + 'sorryserver' => { ip => '0.0.0.0', port => 0 }, 'service' => undef, 'login' => '', 'fallback' => undef, @@ -272,7 +272,7 @@ CONFIG 'virtualhost' => undef, 'quiescent' => undef, 'realrecovercallback' => undef, - 'sorryserver' => undef, + 'sorryserver' => { ip => '0.0.0.0', port => 0 }, 'service' => undef, 'login' => '', 'fallback' => undef, @@ -2760,6 +2760,7 @@ CONFIG remove_config(); } SKIP: { + skip 'various reason...', 2; my $input = <<"CONFIG"; virtual=localhost:http module= 'cINSERT --cookie-name 'Monkey' --cookie-expire 864' @@ -2808,6 +2809,7 @@ CONFIG remove_config(); } SKIP: { + skip 'various reason...', 2; my $input = <<"CONFIG"; virtual=localhost:http module= 'Cinsert --reschedule' -- 2.11.0