Skip to content

Commit 0d2d782

Browse files
Add a nullable logger to MemoryLimitReceiver
1 parent 7a5c7dd commit 0d2d782

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

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

+35-2
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,8 +45,11 @@ public function testReceiverStopsWhenMemoryLimitExceeded($memoryUsage, $memoryLi
4445
return $memoryUsage;
4546
};
4647

47-
$memoryLimitReceiver = new MemoryLimitReceiver($decoratedReceiver, $memoryLimit, $memoryResolver);
48-
$memoryLimitReceiver->receive(function () {});
48+
$memoryLimitReceiver = new MemoryLimitReceiver($decoratedReceiver, $memoryLimit, null, $memoryResolver);
49+
$memoryLimitReceiver->receive(
50+
function () {
51+
}
52+
);
4953
}
5054

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

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

-1
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

+15-4
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,19 @@ 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)
27+
public function __construct(
28+
ReceiverInterface $decoratedReceiver,
29+
string $memoryLimit,
30+
LoggerInterface $logger = null,
31+
callable $memoryResolver = null
32+
)
2633
{
2734
$this->decoratedReceiver = $decoratedReceiver;
2835
$this->memoryLimit = $this->convertToOctets($memoryLimit);
36+
$this->logger = $logger;
2937
$this->memoryResolver = $memoryResolver ?: function () {
3038
return \memory_get_usage();
3139
};
@@ -39,6 +47,9 @@ public function receive(callable $handler): void
3947
$memoryResolver = $this->memoryResolver;
4048
if ($memoryResolver() >= $this->memoryLimit) {
4149
$this->stop();
50+
if ($this->logger) {
51+
$this->logger->info('Receiver stopped due to memory limit exceeded.');
52+
}
4253
}
4354
});
4455
}
@@ -50,16 +61,16 @@ public function stop(): void
5061

5162
private function convertToOctets(string $size): int
5263
{
53-
if (\preg_match('/^(\d+)([G|M|K]*)$/', $size, $matches)) {
64+
if (!\preg_match('/^(\d+)([G|M|K]*)$/', $size, $matches)) {
65+
throw new \InvalidArgumentException('Invalid memory limit given.');
66+
} else {
5467
if ('G' == $matches[2]) {
5568
$size = $matches[1] * 1024 * 1024 * 1024;
5669
} elseif ('M' == $matches[2]) {
5770
$size = $matches[1] * 1024 * 1024;
5871
} elseif ('K' == $matches[2]) {
5972
$size = $matches[1] * 1024;
6073
}
61-
} else {
62-
throw new \InvalidArgumentException('Invalid memory limit given.');
6374
}
6475

6576
return $size;

0 commit comments

Comments
 (0)