From 59f47204b447679d0f2fa1196f628a552b6aea66 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Wed, 28 Aug 2024 15:04:34 -0700 Subject: [PATCH 1/7] Handle file upload future completed exceptionally for Java-based TransferManager and add logging --- .../s3/internal/model/CrtFileUpload.java | 23 +++++++++++++++++-- .../s3/internal/model/DefaultFileUpload.java | 20 ++++++++++++++-- .../utils/ResumableRequestConverter.java | 4 ++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java index 790fb0d2ba60..2d6dc60392ed 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java @@ -22,17 +22,21 @@ import software.amazon.awssdk.crt.CrtRuntimeException; import software.amazon.awssdk.crt.s3.ResumeToken; import software.amazon.awssdk.services.s3.internal.crt.S3MetaRequestPauseObservable; +import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.TransferProgress; import software.amazon.awssdk.utils.Lazy; +import software.amazon.awssdk.utils.Logger; import software.amazon.awssdk.utils.ToString; import software.amazon.awssdk.utils.Validate; @SdkInternalApi public final class CrtFileUpload implements FileUpload { + private static final Logger log = Logger.loggerFor(S3TransferManager.class); + private final Lazy resumableFileUpload; private final CompletableFuture completionFuture; private final TransferProgress progress; @@ -57,7 +61,14 @@ public ResumableFileUpload pause() { private ResumableFileUpload doPause() { File sourceFile = request.source().toFile(); - if (completionFuture.isDone()) { + + boolean futureCompletedExceptionally = completionFuture.isCompletedExceptionally(); + if (completionFuture.isDone() + // TODO - uncomment once CRT handles future completed exceptionally to return ResumeToken + //&& !futureCompletedExceptionally + ) { + log.debug(() -> "The upload future was completed. There will be no ResumeToken returned."); + Instant fileLastModified = Instant.ofEpochMilli(sourceFile.lastModified()); return ResumableFileUpload.builder() .fileLastModified(fileLastModified) @@ -80,8 +91,15 @@ private ResumableFileUpload doPause() { } completionFuture.cancel(true); - // Upload hasn't started yet, or it's a single object upload if (token == null) { + if (futureCompletedExceptionally) { + log.debug(() -> "The upload future was completed exceptionally and the ResumeToken returned by the " + + "S3MetaRequest was null."); + } else { + log.debug(() -> "The upload hasn't started yet or it's a single object upload. There will be no ResumeToken " + + "returned"); + } + return ResumableFileUpload.builder() .fileLastModified(fileLastModified) .fileLength(sourceFile.length()) @@ -89,6 +107,7 @@ private ResumableFileUpload doPause() { .build(); } + log.debug(() -> "The upload was successfully paused and a ResumeToken was returned."); return ResumableFileUpload.builder() .multipartUploadId(token.getUploadId()) .totalParts(token.getTotalNumParts()) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java index 66647d27cd61..f596910efbff 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java @@ -21,17 +21,21 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.services.s3.multipart.PauseObservable; import software.amazon.awssdk.services.s3.multipart.S3ResumeToken; +import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.TransferProgress; import software.amazon.awssdk.utils.Lazy; +import software.amazon.awssdk.utils.Logger; import software.amazon.awssdk.utils.ToString; import software.amazon.awssdk.utils.Validate; @SdkInternalApi public final class DefaultFileUpload implements FileUpload { + private static final Logger log = Logger.loggerFor(S3TransferManager.class); + private final Lazy resumableFileUpload; private final CompletableFuture completionFuture; private final TransferProgress progress; @@ -70,17 +74,29 @@ private ResumableFileUpload doPause() { .fileLength(sourceFile.length()) .uploadFileRequest(request); - if (completionFuture.isDone()) { + boolean futureCompletedExceptionally = completionFuture.isCompletedExceptionally(); + if (completionFuture.isDone() && !futureCompletedExceptionally) { + log.debug(() -> "The upload future was finished and was not completed exceptionally. There will be no S3ResumeToken " + + "returned."); + return resumableFileBuilder.build(); } S3ResumeToken token = pauseObservable.pause(); - // Upload hasn't started yet, or it's a single object upload if (token == null) { + log.debug(() -> "The upload hasn't started yet, or it's a single object upload. There will be no S3ResumeToken " + + "returned."); return resumableFileBuilder.build(); } + if (futureCompletedExceptionally) { + log.debug(() -> "The upload future was completed exceptionally but has been successfully paused and a S3ResumeToken " + + "was returned."); + } else { + log.debug(() -> "The upload was successfully paused and a S3ResumeToken was returned."); + } + return resumableFileBuilder.multipartUploadId(token.uploadId()) .totalParts(token.totalNumParts()) .transferredParts(token.numPartsCompleted()) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/utils/ResumableRequestConverter.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/utils/ResumableRequestConverter.java index 4236ece0be23..de3340ec3c05 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/utils/ResumableRequestConverter.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/utils/ResumableRequestConverter.java @@ -77,7 +77,7 @@ private ResumableRequestConverter() { } if (hasRemainingParts(getObjectRequest)) { - // multipart GET for the remaining parts + log.debug(() -> "The paused download was performed with part GET, now resuming download of remaining parts"); Long positionToWriteFrom = MultipartDownloadUtils.multipartDownloadResumeContext(originalDownloadRequest.getObjectRequest()) .map(MultipartDownloadResumeContext::bytesToLastCompletedParts) @@ -92,7 +92,7 @@ private ResumableRequestConverter() { return Pair.of(originalDownloadRequest, responseTransformer); } - // ranged GET for the remaining bytes. + log.debug(() -> "The paused download was performed with range GET, now resuming download of remaining bytes."); newDownloadFileRequest = resumedDownloadFileRequest(resumableFileDownload, originalDownloadRequest, getObjectRequest, From 804f07a55857828023439ded1954f93a9903ef65 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Wed, 28 Aug 2024 15:46:32 -0700 Subject: [PATCH 2/7] Fix Checkstyle --- .../awssdk/transfer/s3/internal/model/CrtFileUpload.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java index 2d6dc60392ed..b02692f58493 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java @@ -64,8 +64,8 @@ private ResumableFileUpload doPause() { boolean futureCompletedExceptionally = completionFuture.isCompletedExceptionally(); if (completionFuture.isDone() - // TODO - uncomment once CRT handles future completed exceptionally to return ResumeToken - //&& !futureCompletedExceptionally + // TODO - uncomment once CRT handles future completed exceptionally to return ResumeToken + //&& !futureCompletedExceptionally ) { log.debug(() -> "The upload future was completed. There will be no ResumeToken returned."); @@ -94,7 +94,7 @@ private ResumableFileUpload doPause() { if (token == null) { if (futureCompletedExceptionally) { log.debug(() -> "The upload future was completed exceptionally and the ResumeToken returned by the " - + "S3MetaRequest was null."); + + "S3 MetaRequest was null."); } else { log.debug(() -> "The upload hasn't started yet or it's a single object upload. There will be no ResumeToken " + "returned"); From 15df48ddf0106030acde8590dd5324eba3a9bc43 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Wed, 28 Aug 2024 16:07:20 -0700 Subject: [PATCH 3/7] Fix logging for CrtFileUpload --- .../awssdk/transfer/s3/internal/model/CrtFileUpload.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java index b02692f58493..3364be9528f9 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java @@ -63,10 +63,7 @@ private ResumableFileUpload doPause() { File sourceFile = request.source().toFile(); boolean futureCompletedExceptionally = completionFuture.isCompletedExceptionally(); - if (completionFuture.isDone() - // TODO - uncomment once CRT handles future completed exceptionally to return ResumeToken - //&& !futureCompletedExceptionally - ) { + if (completionFuture.isDone() && !futureCompletedExceptionally) { log.debug(() -> "The upload future was completed. There will be no ResumeToken returned."); Instant fileLastModified = Instant.ofEpochMilli(sourceFile.lastModified()); @@ -92,6 +89,7 @@ private ResumableFileUpload doPause() { completionFuture.cancel(true); if (token == null) { + // TODO - remove once CRT handles future completed exceptionally to return ResumeToken if (futureCompletedExceptionally) { log.debug(() -> "The upload future was completed exceptionally and the ResumeToken returned by the " + "S3 MetaRequest was null."); From b5642cbdf27837d051c0db25e465fbbd04732f85 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Thu, 29 Aug 2024 11:27:44 -0700 Subject: [PATCH 4/7] Add wiremock tests --- .../DefaultFileUploadWireMockTest.java | 91 ++++++++++++++----- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java index b76a24518a3d..668679e82e52 100644 --- a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java +++ b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java @@ -25,19 +25,19 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.github.tomakehurst.wiremock.WireMockServer; -import com.google.common.jimfs.Configuration; -import com.google.common.jimfs.Jimfs; +import com.github.tomakehurst.wiremock.http.Fault; import java.io.IOException; import java.io.OutputStream; import java.io.UncheckedIOException; import java.net.URI; -import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.concurrent.CompletionException; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -50,6 +50,8 @@ import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.model.S3Exception; import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.FileUpload; +import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; /** @@ -57,20 +59,19 @@ */ public class DefaultFileUploadWireMockTest { private static final WireMockServer wireMock = new WireMockServer(wireMockConfig().dynamicPort()); - private static final FileSystem testFs = Jimfs.newFileSystem(Configuration.unix()); private static Path testFile; private static S3AsyncClient s3; @BeforeAll - public static void setup() { - testFile = testFs.getPath("/32mib.dat"); + public static void setup() throws IOException { + testFile = Files.createTempFile("32mib", ".dat"); writeTestFile(testFile, 32 * 1024 * 1024); wireMock.start(); } @AfterAll public static void teardown() throws IOException { - testFs.close(); + Files.deleteIfExists(testFile); wireMock.stop(); } @@ -98,29 +99,14 @@ public void methodTeardown() { @Test void retryableErrorDuringUpload_shouldSupportRetries() { S3TransferManager tm = S3TransferManager.builder().s3Client(s3).build(); - - String mpuInitBody = "" - + "\n" - + "\n" - + " bucket\n" - + " key\n" - + " uploadId\n" - + ""; - - wireMock.stubFor(post(urlEqualTo("/bucket/key?uploads")) - .willReturn(aResponse() - .withStatus(200) - .withBody(mpuInitBody))); + stubCreateMpuSuccessfulResponse(); wireMock.stubFor(put(anyUrl()) .willReturn(aResponse() .withStatus(500) .withBody("Internal Error"))); - UploadFileRequest request = UploadFileRequest.builder() - .source(testFile) - .putObjectRequest(put -> put.bucket("bucket").key("key")) - .build(); + UploadFileRequest request = createUploadFileRequest(); assertThatThrownBy(() -> tm.uploadFile(request).completionFuture().join()) .hasCauseInstanceOf(S3Exception.class); @@ -131,8 +117,63 @@ void retryableErrorDuringUpload_shouldSupportRetries() { .withQueryParam("partNumber", matching("1"))); } + @Test + void connectionFaultDuringUpload_shouldSaveStateOfUpload() { + S3TransferManager tm = S3TransferManager.builder().s3Client(s3).build(); + + stubCreateMpuSuccessfulResponse(); + + wireMock.stubFor(put(urlPathMatching("/bucket/key?partNumber=1&uploadId=uploadId")) + .willReturn(aResponse() + .withStatus(200) + .withBody("1\"etag1\""))); + + wireMock.stubFor(put(urlPathMatching("/bucket/key?partNumber=2&uploadId=uploadId")) + .willReturn(aResponse() + .withFault(Fault.CONNECTION_RESET_BY_PEER))); + + UploadFileRequest request = createUploadFileRequest(); + + assertThatThrownBy(() -> tm.uploadFile(request).completionFuture().join()) + .hasCauseInstanceOf(S3Exception.class); + + FileUpload fileUpload = null; + try { + fileUpload = tm.uploadFile(request); + + fileUpload.completionFuture().join(); + } catch (Exception e) { + assertThat(e).isInstanceOf(CompletionException.class); + ResumableFileUpload resumableFileUpload = fileUpload.pause(); + assertThat(resumableFileUpload.multipartUploadId()).isPresent(); + assertThat(resumableFileUpload.multipartUploadId().get()).isEqualTo("uploadId"); + + } + } + + private void stubCreateMpuSuccessfulResponse() { + String mpuInitBody = "\n" + + "\n" + + " bucket\n" + + " key\n" + + " uploadId\n" + + ""; + + wireMock.stubFor(post(urlEqualTo("/bucket/key?uploads")) + .willReturn(aResponse() + .withStatus(200) + .withBody(mpuInitBody))); + } + + private UploadFileRequest createUploadFileRequest() { + return UploadFileRequest.builder() + .source(testFile) + .putObjectRequest(put -> put.bucket("bucket").key("key")) + .build(); + } + private static void writeTestFile(Path file, long size) { - try (OutputStream os = Files.newOutputStream(file, StandardOpenOption.CREATE_NEW)) { + try (OutputStream os = Files.newOutputStream(file, StandardOpenOption.CREATE)) { byte[] buff = new byte[4096]; long remaining = size; while (remaining != 0) { From a1defa2497d1b8bcaaa1a473ac25c5cb72a8a580 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Thu, 29 Aug 2024 11:37:59 -0700 Subject: [PATCH 5/7] Remove redundant test code --- .../s3/internal/DefaultFileUploadWireMockTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java index 668679e82e52..2732c5b46cb2 100644 --- a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java +++ b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java @@ -134,14 +134,9 @@ void connectionFaultDuringUpload_shouldSaveStateOfUpload() { UploadFileRequest request = createUploadFileRequest(); - assertThatThrownBy(() -> tm.uploadFile(request).completionFuture().join()) - .hasCauseInstanceOf(S3Exception.class); - FileUpload fileUpload = null; try { - fileUpload = tm.uploadFile(request); - - fileUpload.completionFuture().join(); + tm.uploadFile(request); } catch (Exception e) { assertThat(e).isInstanceOf(CompletionException.class); ResumableFileUpload resumableFileUpload = fileUpload.pause(); From 32cc76b08e2e69b634e0f27b77d2a6c6c67d2cdb Mon Sep 17 00:00:00 2001 From: hdavidh Date: Thu, 29 Aug 2024 11:38:17 -0700 Subject: [PATCH 6/7] Remove redundant test code --- .../transfer/s3/internal/DefaultFileUploadWireMockTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java index 2732c5b46cb2..79f487ea4d64 100644 --- a/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java +++ b/services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/DefaultFileUploadWireMockTest.java @@ -142,7 +142,6 @@ void connectionFaultDuringUpload_shouldSaveStateOfUpload() { ResumableFileUpload resumableFileUpload = fileUpload.pause(); assertThat(resumableFileUpload.multipartUploadId()).isPresent(); assertThat(resumableFileUpload.multipartUploadId().get()).isEqualTo("uploadId"); - } } From 6412820e2d97461d1abb550de41962bd27b06295 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Thu, 29 Aug 2024 21:34:00 -0700 Subject: [PATCH 7/7] Update logging --- .../awssdk/transfer/s3/internal/model/CrtFileUpload.java | 4 +--- .../awssdk/transfer/s3/internal/model/DefaultFileUpload.java | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java index 3364be9528f9..e7bc77884029 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/CrtFileUpload.java @@ -22,7 +22,6 @@ import software.amazon.awssdk.crt.CrtRuntimeException; import software.amazon.awssdk.crt.s3.ResumeToken; import software.amazon.awssdk.services.s3.internal.crt.S3MetaRequestPauseObservable; -import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload; @@ -35,7 +34,7 @@ @SdkInternalApi public final class CrtFileUpload implements FileUpload { - private static final Logger log = Logger.loggerFor(S3TransferManager.class); + private static final Logger log = Logger.loggerFor(CrtFileUpload.class); private final Lazy resumableFileUpload; private final CompletableFuture completionFuture; @@ -105,7 +104,6 @@ private ResumableFileUpload doPause() { .build(); } - log.debug(() -> "The upload was successfully paused and a ResumeToken was returned."); return ResumableFileUpload.builder() .multipartUploadId(token.getUploadId()) .totalParts(token.getTotalNumParts()) diff --git a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java index f596910efbff..04519c28b16c 100644 --- a/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java +++ b/services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/model/DefaultFileUpload.java @@ -21,7 +21,6 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.services.s3.multipart.PauseObservable; import software.amazon.awssdk.services.s3.multipart.S3ResumeToken; -import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload; @@ -34,7 +33,7 @@ @SdkInternalApi public final class DefaultFileUpload implements FileUpload { - private static final Logger log = Logger.loggerFor(S3TransferManager.class); + private static final Logger log = Logger.loggerFor(DefaultFileUpload.class); private final Lazy resumableFileUpload; private final CompletableFuture completionFuture;