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