Aboid zombies when using custom health check.
Fix sorryserver remove.
Wait for process to stop when using stop, restart, try-restart command.
maxconn => 0,
qosup => 0,
qosdown => 0,
- sorryserver => undef,
+ sorryserver => { ip => '0.0.0.0', port => 0 },
request => undef,
receive => undef,
httpmethod => 'GET',
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) {
sub search_l7vsadm_file {
my $l7vsadm_file = undef;
my @search_path = qw(
- ./l7vsadm
/usr/sbin/l7vsadm
/sbin/l7vsadm
+ ./l7vsadm
);
for my $file (@search_path) {
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();
return $stop_result;
}
- # wait for pid file
- sleep 1;
-
# start
my $status = cmd_start();
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) {
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} ) );
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;
};
return $name;
}
- my $port = ( getservbyname($name, $protocol) )[2] or return;
+ my $port = ( getservbyname($name, $protocol) )[2];
return $port;
}
}
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};
}
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: {
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)';
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;
}
{
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';
$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 {
'virtualhost' => undef,
'quiescent' => undef,
'realrecovercallback' => undef,
- 'sorryserver' => undef,
+ 'sorryserver' => { ip => '0.0.0.0', port => 0 },
'service' => undef,
'login' => '',
'fallback' => undef,
'virtualhost' => undef,
'quiescent' => undef,
'realrecovercallback' => undef,
- 'sorryserver' => undef,
+ 'sorryserver' => { ip => '0.0.0.0', port => 0 },
'service' => undef,
'login' => '',
'fallback' => undef,
'virtualhost' => undef,
'quiescent' => undef,
'realrecovercallback' => undef,
- 'sorryserver' => undef,
+ 'sorryserver' => { ip => '0.0.0.0', port => 0 },
'service' => undef,
'login' => '',
'fallback' => undef,
remove_config();
}
SKIP: {
+ skip 'various reason...', 2;
my $input = <<"CONFIG";
virtual=localhost:http
module= 'cINSERT --cookie-name 'Monkey' --cookie-expire 864'
remove_config();
}
SKIP: {
+ skip 'various reason...', 2;
my $input = <<"CONFIG";
virtual=localhost:http
module= 'Cinsert --reschedule'