8000 Add a nullable logger to MemoryLimitReceiver · symfony/symfony@9d9867f · GitHub
[go: up one dir, main page]

Skip to content

Commit 9d9867f

Browse files
Add a nullable logger to MemoryLimitReceiver
1 parent a35d089 commit 9d9867f

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

src/Symfony/Component/Messenger/Tests/Transport/Enhancers/MemoryLimitReceiverTest.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Tests\Transport\Enhancers;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Psr\Log\LoggerInterface;
1516
use Symfony\Component\Messenger\Tests\Fixtures\CallbackReceiver;
1617
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
1718
use Symfony\Component\Messenger\Transport\Enhancers\MemoryLimitReceiver;
@@ -44,7 +45,7 @@ public function testReceiverStopsWhenMemoryLimitExceeded($memoryUsage, $memoryLi
4445
return $memoryUsage;
4546
};
4647

47-
$memoryLimitReceiver = new MemoryLimitReceiver($decoratedReceiver, $memoryLimit, $memoryResolver);
48+
$memoryLimitReceiver = new MemoryLimitReceiver($decoratedReceiver, $memoryLimit, null, $memoryResolver);
4849
$memoryLimitReceiver->receive(function () {});
4950
}
5051

@@ -83,4 +84,30 @@ public function invalidMemoryLimitProvider()
8384
yield array('128m'); // lowercase unit
8485
yield array('128 M'); // string with space
8586
}
87+
88+
public function testReceiverLogsMemoryExceededWhenLoggerIsGiven()
89+
{
90+
$callable = function ($handler) {
91+
$handler(new DummyMessage('API'));
92+
};
93+
94+
$decoratedReceiver = $this->getMockBuilder(CallbackReceiver::class)
95+
->setConstructorArgs(array($callable))
96+
->enableProxyingToOriginalMethods()
97+
->getMock();
98+
99+
$decoratedReceiver->expects($this->once())->method('receive');
100+
$decoratedReceiver->expects($this->once())->method('stop');
101+
102+
$logger = $this->createMock(LoggerInterface::class);
103+
$logger->expects($this->once())->method('info')
104+
->with($this->equalTo('Receiver stopped due to memory limit exceeded.'));
105+
106+
$memoryResolver = function () {
107+
return 70 * 1024 * 1024;
108+
};
109+
110+
$memoryLimitReceiver = new MemoryLimitReceiver($decoratedReceiver, '64M', $logger, $memoryResolver);
111+
$memoryLimitReceiver->receive(function () {});
112+
}
86113
}

src/Symfony/Component/Messenger/Tests/WorkerTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Symfony\Component\Messenger\MessageBusInterface;
1717
use Symfony\Component\Messenger\Tests\Fixtures\CallbackReceiver;
1818
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
19-
use Symfony\Component\Messenger\Transport\ReceiverInterface;
2019
use Symfony\Component\Messenger\Worker;
2120

2221
class WorkerTest extends TestCase

src/Symfony/Component/Messenger/Transport/Enhancers/MemoryLimitReceiver.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Transport\Enhancers;
1313

14+
use Psr\Log\LoggerInterface;
1415
use Symfony\Component\Messenger\Transport\ReceiverInterface;
1516

1617
/**
@@ -20,12 +21,18 @@ class MemoryLimitReceiver implements ReceiverInterface
2021
{
2122
private $decoratedReceiver;
2223
private $memoryLimit;
24+
private $logger;
2325
private $memoryResolver;
2426

25-
public function __construct(ReceiverInterface $decoratedReceiver, string $memoryLimit, callable $memoryResolver = null)
26-
{
27+
public function __construct(
28+
ReceiverInterface $decoratedReceiver,
29+
string $memoryLimit,
30+
LoggerInterface $logger = null,
31+
callable $memoryResolver = null
32+
) {
2733
$this->decoratedReceiver = $decoratedReceiver;
2834
$this->memoryLimit = $this->convertToOctets($memoryLimit);
35+
$this->logger = $logger;
2936
$this->memoryResolver = $memoryResolver ?: function () {
3037
return \memory_get_usage();
3138
};
@@ -39,6 +46,9 @@ public function receive(callable $handler): void
3946
$memoryResolver = $this->memoryResolver;
4047
if ($memoryResolver() >= $this->memoryLimit) {
4148
$this->stop();
49+
if ($this->logger) {
50+
$this->logger->info('Receiver stopped due to memory limit exceeded.');
51+
}
4252
}
4353
});
4454
}
@@ -50,16 +60,16 @@ public function stop(): void
5060

5161
private function convertToOctets(string $size): int
5262
{
53-
if (\preg_match('/^(\d+)([G|M|K]*)$/', $size, $matches)) {
63+
if (!\preg_match('/^(\d+)([G|M|K]*)$/', $size, $matches)) {
64+
throw new \InvalidArgumentException('Invalid memory limit given.');
65+
} else {
5466
if ('G' == $matches[2]) {
5567
$size = $matches[1] * 1024 * 1024 * 1024;
5668
} elseif ('M' == $matches[2]) {
5769
$size = $matches[1] * 1024 * 1024;
5870
} elseif ('K' == $matches[2]) {
5971
$size = $matches[1] * 1024;
6072
}
61-
} else {
62-
throw new \InvalidArgumentException('Invalid memory limit given.');
6373
}
6474

6575
return $size;

0 commit comments

Comments
 (0)
0