From 0940b82523782a020c11497c29c1c0c99e39d871 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Tue, 17 Dec 2019 08:54:29 +0100 Subject: [PATCH] Better Logging S3 Bulk Delete Failures (#50203) Unfortunately bulk delete exceptions don't show the individual delete errors when a bulk delete fails when you log them outright so I added this work-around to get the individual details to get useful logging. --- .../elasticsearch/repositories/s3/S3BlobContainer.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobContainer.java b/plugins/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobContainer.java index 6afb81da5e02c..9cb118d60086f 100644 --- a/plugins/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobContainer.java +++ b/plugins/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobContainer.java @@ -32,6 +32,9 @@ import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.UploadPartRequest; import com.amazonaws.services.s3.model.UploadPartResult; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.message.ParameterizedMessage; import org.apache.lucene.util.SetOnce; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.common.Nullable; @@ -61,6 +64,8 @@ class S3BlobContainer extends AbstractBlobContainer { + private static final Logger logger = LogManager.getLogger(S3BlobContainer.class); + /** * Maximum number of deletes in a {@link DeleteObjectsRequest}. * @see S3 Documentation. @@ -189,6 +194,10 @@ private void doDeleteBlobs(List blobNames, boolean relative) throws IOEx outstanding.removeAll(keysInRequest); outstanding.addAll( e.getErrors().stream().map(MultiObjectDeleteException.DeleteError::getKey).collect(Collectors.toSet())); + logger.warn( + () -> new ParameterizedMessage("Failed to delete some blobs {}", e.getErrors() + .stream().map(err -> "[" + err.getKey() + "][" + err.getCode() + "][" + err.getMessage() + "]") + .collect(Collectors.toList())), e); aex = ExceptionsHelper.useOrSuppress(aex, e); } catch (AmazonClientException e) { // The AWS client threw any unexpected exception and did not execute the request at all so we do not