From 8337a724d1ecd06b991dfd39072588a769f6a869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 16 Apr 2025 16:26:02 +0200 Subject: [PATCH] Fix error when cleaning non-existent stored object versions Prevent the `RemoveOldVersionMessageHandler` from throwing errors when the stored object version is missing on disk. Introduced a check to log a notice instead of attempting deletion in such cases and added corresponding test coverage. --- .../unreleased/Fixed-20250416-162257.yaml | 6 +++++ .../RemoveOldVersionMessageHandler.php | 10 ++++++- .../RemoveOldVersionMessageHandlerTest.php | 26 ++++++++++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 .changes/unreleased/Fixed-20250416-162257.yaml diff --git a/.changes/unreleased/Fixed-20250416-162257.yaml b/.changes/unreleased/Fixed-20250416-162257.yaml new file mode 100644 index 000000000..3e371b8ef --- /dev/null +++ b/.changes/unreleased/Fixed-20250416-162257.yaml @@ -0,0 +1,6 @@ +kind: Fixed +body: When cleaning the old stored object versions, do not throw an error if the stored object is not found on disk +time: 2025-04-16T16:22:57.309699258+02:00 +custom: + Issue: "" + SchemaChange: No schema change diff --git a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectCleaner/RemoveOldVersionMessageHandler.php b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectCleaner/RemoveOldVersionMessageHandler.php index ea3e37be7..f0542bb88 100644 --- a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectCleaner/RemoveOldVersionMessageHandler.php +++ b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectCleaner/RemoveOldVersionMessageHandler.php @@ -62,7 +62,15 @@ final readonly class RemoveOldVersionMessageHandler implements MessageHandlerInt $storedObject = $storedObjectVersion->getStoredObject(); - $this->storedObjectManager->delete($storedObjectVersion); + if ($this->storedObjectManager->exists($storedObjectVersion)) { + $this->storedObjectManager->delete($storedObjectVersion); + } else { + $this->logger->notice( + self::LOG_PREFIX.'Stored object version does not exists any more.', + ['storedObjectVersionName' => $storedObjectVersion->getFilename()], + ); + } + // to ensure an immediate deletion $this->entityManager->remove($storedObjectVersion); diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectCleaner/RemoveOldVersionMessageHandlerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectCleaner/RemoveOldVersionMessageHandlerTest.php index c5c07aa02..875f6f889 100644 --- a/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectCleaner/RemoveOldVersionMessageHandlerTest.php +++ b/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectCleaner/RemoveOldVersionMessageHandlerTest.php @@ -44,6 +44,7 @@ class RemoveOldVersionMessageHandlerTest extends TestCase $entityManager->expects($this->once())->method('clear'); $storedObjectManager = $this->createMock(StoredObjectManagerInterface::class); + $storedObjectManager->expects($this->once())->method('exists')->willReturn(true); $storedObjectManager->expects($this->once())->method('delete')->with($this->identicalTo($version)); $handler = new RemoveOldVersionMessageHandler($storedObjectVersionRepository, new NullLogger(), $entityManager, $storedObjectManager, new MockClock()); @@ -51,6 +52,29 @@ class RemoveOldVersionMessageHandlerTest extends TestCase $handler(new RemoveOldVersionMessage(1)); } + public function testInvokeForVersionNotExisting(): void + { + $object = new StoredObject(); + $version = $object->registerVersion(); + $storedObjectVersionRepository = $this->createMock(StoredObjectVersionRepository::class); + $storedObjectVersionRepository->expects($this->once())->method('find') + ->with($this->identicalTo(1)) + ->willReturn($version); + + $entityManager = $this->createMock(EntityManagerInterface::class); + $entityManager->expects($this->once())->method('remove')->with($this->identicalTo($version)); + $entityManager->expects($this->once())->method('flush'); + $entityManager->expects($this->once())->method('clear'); + + $storedObjectManager = $this->createMock(StoredObjectManagerInterface::class); + $storedObjectManager->expects($this->once())->method('exists')->willReturn(false); + $storedObjectManager->expects($this->never())->method('delete')->with($this->identicalTo($version)); + + $handler = new RemoveOldVersionMessageHandler($storedObjectVersionRepository, new NullLogger(), $entityManager, $storedObjectManager, new MockClock()); + + $handler(new RemoveOldVersionMessage(1)); + } + public function testInvokeWithStoredObjectToDelete(): void { $object = new StoredObject(); @@ -123,6 +147,6 @@ class DummyStoredObjectManager implements StoredObjectManagerInterface public function exists(StoredObject|StoredObjectVersion $document): bool { - throw new \RuntimeException(); + return true; } }