-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinearRetryPolicy.php
45 lines (38 loc) · 1.42 KB
/
LinearRetryPolicy.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php declare(strict_types=1);
/*
* This file is part of ksaveras/circuit-breaker.
*
* (c) Ksaveras Sakys <xawiers@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Ksaveras\CircuitBreaker\Policy;
use Ksaveras\CircuitBreaker\Circuit;
final class LinearRetryPolicy implements RetryPolicyInterface
{
public function __construct(
private readonly int $startSleepSeconds,
private readonly int $maxSleepSeconds,
private readonly int $step,
) {
if ($this->startSleepSeconds < 0) {
throw new \InvalidArgumentException('Start sleep value value can not be negative number.');
}
if ($this->step <= 0) {
throw new \InvalidArgumentException('Step value must be positive number.');
}
if ($this->maxSleepSeconds <= 0 || $this->startSleepSeconds > $this->maxSleepSeconds) {
throw new \InvalidArgumentException('Maximum sleep value must be positive and greater than start sleep.');
}
}
public function calculate(Circuit $circuit): int
{
$retries = max(0, $circuit->getFailureCount() - $circuit->getFailureThreshold());
return min($this->maxSleepSeconds, $this->startSleepSeconds + ($retries * $this->step));
}
public function initialDelay(): int
{
return $this->startSleepSeconds;
}
}