From 33956074af107be8021028aa2e26b487f0984443 Mon Sep 17 00:00:00 2001 From: Frank Cizmich Date: Mon, 30 Mar 2015 19:27:46 -0300 Subject: [PATCH 1/2] pt-heartbeat sometimes failed with --sleep due to race condition --- bin/pt-heartbeat | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/bin/pt-heartbeat b/bin/pt-heartbeat index 17115c59..37768302 100755 --- a/bin/pt-heartbeat +++ b/bin/pt-heartbeat @@ -5286,13 +5286,14 @@ sub main { ) { eval { my $next_interval = $get_next_interval->(); - if ( time >= $next_interval ) { + my $time = time; + if ( $time >= $next_interval ) { do { $next_interval = $get_next_interval->() } - until $next_interval > time; + until $next_interval > $time; PTDEBUG && _d("Missed last interval; next interval:", ts($next_interval)); } - sleep $next_interval - time; + sleep $next_interval - $time; PTDEBUG && _d('Woke up at', ts(time)); # Connect or reconnect if necessary. @@ -5419,13 +5420,14 @@ sub check_delay { PTDEBUG && _d('Checking slave', $dp->as_string($dsn)); my $next_interval = $get_next_interval->(); - if ( time >= $next_interval ) { + my $time = time; + if ( $time >= $next_interval ) { do { $next_interval = $get_next_interval->() } - until $next_interval > time; + until $next_interval > $time; PTDEBUG && _d("Missed last interval; next interval:", ts($next_interval)); } - sleep $next_interval - time; + sleep $next_interval - $time; PTDEBUG && _d('Woke up at', ts(time)); my ($delay, $hostname, $master_server_id) = $get_delay->($sth); From c47660211fca3d5bd1ea1c6c73ddb8cb48de680e Mon Sep 17 00:00:00 2001 From: Frank Cizmich Date: Mon, 6 Apr 2015 18:20:55 -0300 Subject: [PATCH 2/2] pt-heartbeat added comment for issue 1406390 fix --- bin/pt-heartbeat | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/pt-heartbeat b/bin/pt-heartbeat index 37768302..6e815956 100755 --- a/bin/pt-heartbeat +++ b/bin/pt-heartbeat @@ -5286,6 +5286,8 @@ sub main { ) { eval { my $next_interval = $get_next_interval->(); + # save current time in variable to avoid race condition + # https://bugs.launchpad.net/percona-toolkit/+bug/1406390 my $time = time; if ( $time >= $next_interval ) { do { $next_interval = $get_next_interval->() } @@ -5420,6 +5422,8 @@ sub check_delay { PTDEBUG && _d('Checking slave', $dp->as_string($dsn)); my $next_interval = $get_next_interval->(); + # save current time in variable to avoid race condition + # https://bugs.launchpad.net/percona-toolkit/+bug/1406390 my $time = time; if ( $time >= $next_interval ) { do { $next_interval = $get_next_interval->() }