diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreDAOContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreDAOContract.java index 4a04a82c132..90dc41e2453 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreDAOContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreDAOContract.java @@ -67,6 +67,14 @@ default void deleteShouldNotThrowWhenBucketDoesNotExist() { .doesNotThrowAnyException(); } + @Test + default void deleteBlobsShouldNotThrowWhenBucketDoesNotExist() { + BlobStoreDAO store = testee(); + + assertThatCode(() -> Mono.from(store.delete(TEST_BUCKET_NAME, ImmutableList.of(TEST_BLOB_ID, OTHER_TEST_BLOB_ID))).block()) + .doesNotThrowAnyException(); + } + @Test default void deleteShouldDeleteExistingBlobData() { BlobStoreDAO store = testee(); diff --git a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java index 8aeeb44104c..0f8980d4b64 100644 --- a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java +++ b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; import jakarta.inject.Inject; import jakarta.inject.Singleton; @@ -313,7 +314,8 @@ public Publisher delete(BucketName bucketName, Collection blobIds) .map(BlobId::asString) .map(id -> ObjectIdentifier.builder().key(id).build()) .collect(ImmutableList.toImmutableList())) - .then(); + .then() + .onErrorResume(NoSuchBucketException.class, e -> Mono.empty()); } @Override @@ -325,10 +327,10 @@ public Mono deleteBucket(BucketName bucketName) { private Mono deleteResolvedBucket(BucketName bucketName) { return emptyBucket(bucketName) - .onErrorResume(t -> Mono.just(bucketName)) + .onErrorResume(throwable -> throwable instanceof CompletionException && throwable.getCause() instanceof NoSuchBucketException, t -> Mono.just(bucketName)) .flatMap(ignore -> Mono.fromFuture(() -> client.deleteBucket(builder -> builder.bucket(bucketName.asString())))) - .onErrorResume(t -> Mono.empty()) + .onErrorResume(NoSuchBucketException.class, t -> Mono.empty()) .then() .publishOn(Schedulers.parallel()); }