forked from lix-project/hydra
Hydra::Math: add an exponential_backoff function
This commit is contained in:
parent
29738364fb
commit
42c2d2f387
30
src/lib/Hydra/Math.pm
Normal file
30
src/lib/Hydra/Math.pm
Normal file
|
@ -0,0 +1,30 @@
|
|||
package Hydra::Math;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use List::Util qw(min);
|
||||
use Exporter 'import';
|
||||
our @EXPORT_OK = qw(exponential_backoff);
|
||||
|
||||
=head2 exponential_backoff
|
||||
|
||||
Calculates a number of seconds to wait before reattempting something.
|
||||
|
||||
Arguments:
|
||||
|
||||
=over 1
|
||||
|
||||
=item C<$attempts>
|
||||
|
||||
Integer number of attempts made.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
sub exponential_backoff {
|
||||
my ($attempt) = @_;
|
||||
my $clamp = min(10, $attempt);
|
||||
return 2 ** $clamp;
|
||||
}
|
||||
|
||||
1;
|
19
t/Math.t
Normal file
19
t/Math.t
Normal file
|
@ -0,0 +1,19 @@
|
|||
use strict;
|
||||
use warnings;
|
||||
use Setup;
|
||||
|
||||
use Hydra::Math qw(exponential_backoff);
|
||||
|
||||
use Test2::V0;
|
||||
|
||||
subtest "exponential_backoff" => sub {
|
||||
is(exponential_backoff(0), 1);
|
||||
is(exponential_backoff(1), 2);
|
||||
is(exponential_backoff(2), 4);
|
||||
is(exponential_backoff(9), 512);
|
||||
is(exponential_backoff(10), 1024);
|
||||
is(exponential_backoff(11), 1024, "we're clamped to 1024 seconds");
|
||||
is(exponential_backoff(11000), 1024, "we're clamped to 1024 seconds");
|
||||
};
|
||||
|
||||
done_testing;
|
Loading…
Reference in a new issue