mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-08 23:28:19 +00:00
Calc MySQL restart on check-by-check bias to avoid drift causing false-positives.
This commit is contained in:
31
bin/pt-agent
31
bin/pt-agent
@@ -5944,12 +5944,9 @@ sub run_agent {
|
||||
my $services = {};
|
||||
while ( $_oktorun->() ) {
|
||||
check_if_mysql_restarted(
|
||||
Cxn => $cxn,
|
||||
slept => $state->{slept} || 0,
|
||||
Cxn => $cxn,
|
||||
);
|
||||
|
||||
my $t0 = time;
|
||||
|
||||
($config, $lib_dir, $new_daemon, $success) = get_config(
|
||||
link => $agent->links->{config},
|
||||
agent => $agent,
|
||||
@@ -6029,8 +6026,6 @@ sub run_agent {
|
||||
$config ? ($config->options->{'check-interval'}, 0)
|
||||
: ($first_config_interval , 1) # 1=quiet
|
||||
);
|
||||
|
||||
$state->{slept} += int(time - $t0);
|
||||
}
|
||||
|
||||
# This shouldn't happen until the service is stopped/killed.
|
||||
@@ -6300,8 +6295,9 @@ sub get_services {
|
||||
}
|
||||
elsif ( my $ts = $state->{mysql_restarted} ) {
|
||||
$logger->info("Restarting services after MySQL restart at $ts");
|
||||
$prev_services = {};
|
||||
$state->{slept} = 0;
|
||||
$prev_services = {};
|
||||
$state->{last_uptime} = 0;
|
||||
$state->{last_uptime_check} = 0;
|
||||
delete $state->{mysql_restarted};
|
||||
}
|
||||
|
||||
@@ -8420,16 +8416,13 @@ sub check_if_mysql_restarted {
|
||||
my (%args) = @_;
|
||||
have_required_args(\%args, qw(
|
||||
Cxn
|
||||
slept
|
||||
)) or die;
|
||||
my $cxn = $args{Cxn};
|
||||
my $slept = $args{slept};
|
||||
my $cxn = $args{Cxn};
|
||||
|
||||
# Optional args
|
||||
my $uptime = $args{uptime}; # for testing
|
||||
my $margin = $args{margin} || 5;
|
||||
|
||||
my $slept_here = 0;
|
||||
if ( !$uptime ) {
|
||||
$logger->info("Connecting to MySQL");
|
||||
my $t0 = time;
|
||||
@@ -8465,18 +8458,19 @@ sub check_if_mysql_restarted {
|
||||
. "connection to MySQL failed: $e");
|
||||
return;
|
||||
}
|
||||
$slept_here = int(time - $t0);
|
||||
}
|
||||
|
||||
if ( !$state->{initial_uptime} || !$slept ) {
|
||||
my $now = int(time);
|
||||
|
||||
if ( !$state->{last_uptime} || !$state->{last_uptime_check} ) {
|
||||
$logger->info("MySQL uptime: $uptime");
|
||||
$state->{initial_uptime} = $uptime;
|
||||
delete $state->{mysql_restarted};
|
||||
}
|
||||
elsif ( !$state->{mysql_restarted} ) {
|
||||
my $exepected_uptime = $state->{initial_uptime} + $slept + $slept_here;
|
||||
my $elapsed_time = $now - $state->{last_uptime_check};
|
||||
my $exepected_uptime = $state->{last_uptime} + $elapsed_time;
|
||||
my $mysql_restarted = $uptime > ($exepected_uptime - $margin) && $uptime < ($exepected_uptime + $margin) ? 0 : 1;
|
||||
$logger->info("MySQL uptime check: initial=$state->{initial_uptime} slept=$slept expected=$exepected_uptime "
|
||||
$logger->info("MySQL uptime check: last=$state->{last_uptime} elapsed=$elapsed_time expected=$exepected_uptime "
|
||||
. "+/- ${margin}s actual=$uptime");
|
||||
if ( $mysql_restarted ) {
|
||||
$logger->warning("MySQL restarted");
|
||||
@@ -8484,6 +8478,9 @@ sub check_if_mysql_restarted {
|
||||
}
|
||||
}
|
||||
|
||||
$state->{last_uptime} = $uptime;
|
||||
$state->{last_uptime_check} = $now;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user