diff --git a/Classes/Strategy/MutexAdapterStrategy.php b/Classes/Strategy/MutexAdapterStrategy.php index 216c14f98cc5338eeb87b1dcf54c31573bb114cd..9b56b3dda4c26ec987f462971bba34c9120342bd 100644 --- a/Classes/Strategy/MutexAdapterStrategy.php +++ b/Classes/Strategy/MutexAdapterStrategy.php @@ -68,11 +68,20 @@ class MutexAdapterStrategy implements LockingStrategyInterface public function acquire($mode = self::LOCK_CAPABILITY_EXCLUSIVE) { $timeout = null; - if ($mode & static::LOCK_CAPABILITY_NOBLOCK) { + $isNonBlockingMode = $mode & static::LOCK_CAPABILITY_NOBLOCK; + if ($isNonBlockingMode) { $timeout = 0; } - return $this->mutex->acquireLock($timeout); + $isAcquired = $this->mutex->acquireLock($timeout); + if ($isNonBlockingMode && ! $isAcquired) { + throw new LockAcquireWouldBlockException( + 'Failed to acquire lock because the request would block.', + 1428700748 + ); + } + + return $isAcquired; } /** diff --git a/Tests/Unit/Strategy/MutexAdapterStrategyTest.php b/Tests/Unit/Strategy/MutexAdapterStrategyTest.php index 37096201d5f402e6f105a549b8f639dd59f444f3..ecdb78057190aca58bf65c2e69e1a9bb1097b32b 100644 --- a/Tests/Unit/Strategy/MutexAdapterStrategyTest.php +++ b/Tests/Unit/Strategy/MutexAdapterStrategyTest.php @@ -98,6 +98,25 @@ class MutexAdapterStrategyTest extends UnitTestCase $this->assertTrue($sut->acquire($mode)); } + /** + * @test + * @expectedException \TYPO3\CMS\Core\Locking\Exception\LockAcquireWouldBlockException + * @expectedExceptionMessage Failed to acquire lock because the request would block. + * @expectedExceptionCode 1428700748 + */ + public function itThrowsALockAcquireWouldBlockExceptionIfNonBlockingLockWhouldBlock() + { + $mode = LockingStrategyInterface::LOCK_CAPABILITY_EXCLUSIVE | LockingStrategyInterface::LOCK_CAPABILITY_NOBLOCK; + $mutex = $this->prophesize(Mutex::class); + $mutex + ->acquireLock(0) + ->shouldBeCalled() + ->willReturn(false); + $sut = new MutexAdapterStrategy($mutex->reveal()); + + $sut->acquire($mode); + } + /** * @test */