From 6e4c8f645dc8a91e120145f2fafa457de2cb3e72 Mon Sep 17 00:00:00 2001 From: Oliver Stark Date: Mon, 26 Jun 2023 14:52:12 +0200 Subject: [PATCH] Defensive rate limiter: Stop spawning new processes if counting queue jobs failed. --- src/RateLimiter.php | 3 ++- tests/RateLimiterTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/RateLimiter.php b/src/RateLimiter.php index 44b2451..5ee23bb 100644 --- a/src/RateLimiter.php +++ b/src/RateLimiter.php @@ -44,7 +44,8 @@ public function canIUse(string $context = null): bool $this->queue->channel = 'queue'; $reserved = $this->queue->getTotalReserved(); } catch (\Exception) { - $reserved = 0; + $this->increment(); + return false; } $currentUsage = $this->internalCount + $reserved; diff --git a/tests/RateLimiterTest.php b/tests/RateLimiterTest.php index 8475657..c3da3b7 100644 --- a/tests/RateLimiterTest.php +++ b/tests/RateLimiterTest.php @@ -70,4 +70,23 @@ public function getTotalReserved(): int $this->assertSame(0, $this->plugin->getRateLimiter()->getInternalCount()); } + + + public function test_stop_spawning_processes_when_counting_jobs_failed(): void + { + // Fake the reserved count + $queue = new class extends \craft\queue\Queue { + public function getTotalReserved(): int + { + throw new \Exception('Unable to count jobs'); + } + }; + + $this->plugin->set('async_rate_limiter', new \ostark\AsyncQueue\RateLimiter($queue, $this->plugin->getSettings())); + $handler = new \ostark\AsyncQueue\Handlers\BackgroundQueueHandler($this->plugin); + + $handler->__invoke(new PushEvent()); + + $this->assertFalse($this->plugin->getRateLimiter()->canIUse()); + } }