From d35976bce09ac73769fc6f1b3ad8fb63106d3cf3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 21 Nov 2017 17:18:09 +0000 Subject: [PATCH] db_retry: Make the sleeps random and increasing When there's a thundering herd, this can run out of retries. Signed-off-by: Ian Jackson --- Osstest.pm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Osstest.pm b/Osstest.pm index 734c0ef..809194f 100644 --- a/Osstest.pm +++ b/Osstest.pm @@ -311,7 +311,8 @@ sub db_retry ($$$;$$) { my ($pre,$body) = (ref $code eq 'ARRAY') ? @$code : (sub { }, $code); - my $retries= 100; + my $max_retries= 100; + my $retry_count= 0; my $r; local $db_retry_stop; for (;;) { @@ -339,10 +340,12 @@ sub db_retry ($$$;$$) { }; last if !length $@; die $@ unless $mjobdb->need_retry($dbh, $committing); - die "$dbh $body $@ ?" unless $retries-- > 0; + die "$dbh $body $@ GIVING UP ?" if ++$retry_count >= $max_retries; eval { $dbh->rollback(); }; - print STDERR "DB conflict (messages above may refer); retrying...\n"; - sleep(1); + my $delay = rand $retry_count; + print STDERR "DB conflict (messages above may refer);". + " retrying after $delay...\n"; + sleep($delay); } return $r; } -- 2.39.5