mirror of
https://gitee.com/hyperf/hyperf.git
synced 2024-11-29 18:27:44 +08:00
Fixed unexpected behavior in retry budget for hyperf/retry
. (#2693)
* fix: retry budget bug * fix: fix travis * Update CHANGELOG-2.0.md Co-authored-by: 李铭昕 <715557344@qq.com>
This commit is contained in:
parent
9da3463905
commit
61624519fb
@ -8,6 +8,7 @@
|
||||
|
||||
- [#2680](https://github.com/hyperf/hyperf/pull/2680) Fixed Type error for `CastsValue`, because `$isSynchronized` don't have default value.
|
||||
- [#2680](https://github.com/hyperf/hyperf/pull/2680) Fixed default value in `$items` will be replaced by `__construct` for `CastsValue`.
|
||||
- [#2693](https://github.com/hyperf/hyperf/pull/2693) Fixed unexpected behavior in retry budget for `hyperf/retry`.
|
||||
- [#2695](https://github.com/hyperf/hyperf/pull/2695) Fixed method `Container::define()` does not works when the class has been resolved.
|
||||
|
||||
## Optimized
|
||||
|
@ -42,11 +42,17 @@ class RetryBudget implements RetryBudgetInterface
|
||||
*/
|
||||
private $timerId;
|
||||
|
||||
/**
|
||||
* @var float|int
|
||||
*/
|
||||
private $maxToken;
|
||||
|
||||
public function __construct(int $ttl, int $minRetriesPerSec, float $percentCanRetry)
|
||||
{
|
||||
$this->ttl = $ttl;
|
||||
$this->minRetriesPerSec = $minRetriesPerSec;
|
||||
$this->percentCanRetry = $percentCanRetry;
|
||||
$this->maxToken = ($this->minRetriesPerSec / $this->percentCanRetry) * $this->ttl;
|
||||
$this->budget = new SplQueue();
|
||||
}
|
||||
|
||||
@ -70,9 +76,7 @@ class RetryBudget implements RetryBudgetInterface
|
||||
for ($i = 0; $i < $this->minRetriesPerSec / $this->percentCanRetry; ++$i) {
|
||||
$this->produce();
|
||||
}
|
||||
while (! $this->budget->isEmpty()
|
||||
&& $this->budget->top() <= microtime(true)
|
||||
) {
|
||||
while ($this->hasOverflown()) {
|
||||
$this->budget->dequeue();
|
||||
}
|
||||
});
|
||||
@ -98,4 +102,10 @@ class RetryBudget implements RetryBudgetInterface
|
||||
$t = microtime(true) + $this->ttl;
|
||||
$this->budget->push($t);
|
||||
}
|
||||
|
||||
public function hasOverflown(): bool
|
||||
{
|
||||
return (! $this->budget->isEmpty() && $this->budget->bottom() <= microtime(true))
|
||||
|| $this->budget->count() > $this->maxToken;
|
||||
}
|
||||
}
|
||||
|
@ -68,5 +68,20 @@ class RetryBudgetTest extends TestCase
|
||||
$this->assertTrue($budget->consume());
|
||||
$this->assertTrue($budget->consume());
|
||||
$this->assertTrue(! $budget->consume());
|
||||
|
||||
// Retry budget should never have more than 1 token in this test
|
||||
$budget = new RetryBudget(
|
||||
1,
|
||||
1,
|
||||
1
|
||||
);
|
||||
$budget->init();
|
||||
$ref = new \ReflectionClass(RetryBudget::class);
|
||||
$prop = $ref->getProperty('budget');
|
||||
$prop->setAccessible(true);
|
||||
System::sleep(1.2);
|
||||
$this->assertLessThanOrEqual(1, $prop->getValue($budget)->count());
|
||||
System::sleep(1.2);
|
||||
$this->assertLessThanOrEqual(1, $prop->getValue($budget)->count());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user