Skip to content

Commit 5819ab2

Browse files
committed
Added debug log around entire request and prevent random log leaking into transfer manager logging test
1 parent d3a004a commit 5819ab2

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

services-custom/s3-transfer-manager/src/test/java/software/amazon/awssdk/transfer/s3/internal/TransferManagerLoggingTest.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.assertThat;
1919

2020
import java.util.List;
21+
import java.util.function.Predicate;
2122
import org.apache.logging.log4j.Level;
2223
import org.apache.logging.log4j.core.LogEvent;
2324
import org.junit.jupiter.api.Test;
@@ -48,14 +49,15 @@ void transferManager_withCrtClient_shouldNotLogWarnMessages() {
4849
LogCaptor logCaptor = LogCaptor.create(Level.WARN);
4950
S3TransferManager tm = S3TransferManager.builder().s3Client(s3Crt).build()) {
5051
List<LogEvent> events = logCaptor.loggedEvents();
51-
assertThat(events).isEmpty();
52+
assertThat(events)
53+
.withFailMessage("A message from S3TransferManager was logged at DEBUG level when none was expected")
54+
.noneMatch(loggedFromS3TransferManager());
5255
}
5356
}
5457

5558
@Test
5659
void transferManager_withJavaClientMultiPartNotSet_shouldLogDebugMessage() {
5760

58-
5961
try (S3AsyncClient s3Crt = S3AsyncClient.builder()
6062
.region(Region.US_WEST_2)
6163
.credentialsProvider(() -> AwsBasicCredentials.create("foo", "bar"))
@@ -70,7 +72,6 @@ void transferManager_withJavaClientMultiPartNotSet_shouldLogDebugMessage() {
7072
@Test
7173
void transferManager_withJavaClientMultiPartEqualsFalse_shouldLogDebugMessage() {
7274

73-
7475
try (S3AsyncClient s3Crt = S3AsyncClient.builder()
7576
.region(Region.US_WEST_2)
7677
.credentialsProvider(() -> AwsBasicCredentials.create("foo", "bar"))
@@ -90,7 +91,9 @@ void transferManager_withDefaultClient_shouldNotLogDebugMessage() {
9091
try (LogCaptor logCaptor = LogCaptor.create(Level.DEBUG);
9192
S3TransferManager tm = S3TransferManager.builder().build()) {
9293
List<LogEvent> events = logCaptor.loggedEvents();
93-
assertThat(events).isEmpty();
94+
assertThat(events)
95+
.withFailMessage("A message from S3TransferManager was logged at DEBUG level when none was expected")
96+
.noneMatch(loggedFromS3TransferManager());
9497
}
9598
SystemSettingUtilsTestBackdoor.clearEnvironmentVariableOverrides();
9699
}
@@ -106,7 +109,9 @@ void transferManager_withMultiPartEnabledJavaClient_shouldNotLogDebugMessage() {
106109
LogCaptor logCaptor = LogCaptor.create(Level.DEBUG);
107110
S3TransferManager tm = S3TransferManager.builder().s3Client(s3Crt).build()) {
108111
List<LogEvent> events = logCaptor.loggedEvents();
109-
assertThat(events).isEmpty();
112+
assertThat(events)
113+
.withFailMessage("A message from S3TransferManager was logged at DEBUG level when none was expected")
114+
.noneMatch(loggedFromS3TransferManager());
110115
}
111116
}
112117

@@ -122,7 +127,9 @@ void transferManager_withMultiPartEnabledAndCrossRegionEnabledJavaClient_shouldN
122127
LogCaptor logCaptor = LogCaptor.create(Level.DEBUG);
123128
S3TransferManager tm = S3TransferManager.builder().s3Client(s3Crt).build()) {
124129
List<LogEvent> events = logCaptor.loggedEvents();
125-
assertThat(events).isEmpty();
130+
assertThat(events)
131+
.withFailMessage("A message from S3TransferManager was logged at DEBUG level when none was expected")
132+
.noneMatch(loggedFromS3TransferManager());
126133
}
127134
}
128135

@@ -133,4 +140,9 @@ private static void assertLogged(List<LogEvent> events, org.apache.logging.log4j
133140
assertThat(msg).isEqualTo(message);
134141
assertThat(event.getLevel()).isEqualTo(level);
135142
}
143+
144+
private static Predicate<LogEvent> loggedFromS3TransferManager() {
145+
String tmLoggerName = "software.amazon.awssdk.transfer.s3.S3TransferManager";
146+
return logEvent -> tmLoggerName.equals(logEvent.getLoggerName());
147+
}
136148
}

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/multipart/MultipartDownloaderSubscriber.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public MultipartDownloaderSubscriber(S3AsyncClient s3, GetObjectRequest getObjec
8888

8989
@Override
9090
public void onSubscribe(Subscription s) {
91+
log.trace(() -> "onSubscribe");
9192
if (this.subscription != null) {
9293
s.cancel();
9394
return;
@@ -98,7 +99,7 @@ public void onSubscribe(Subscription s) {
9899

99100
@Override
100101
public void onNext(AsyncResponseTransformer<GetObjectResponse, GetObjectResponse> asyncResponseTransformer) {
101-
log.trace(() -> "onNext " + completedParts.get());
102+
log.trace(() -> String.format("onNext, completed part = %d", completedParts.get()));
102103
if (asyncResponseTransformer == null) {
103104
throw new NullPointerException("onNext must not be called with null asyncResponseTransformer");
104105
}
@@ -107,21 +108,28 @@ public void onNext(AsyncResponseTransformer<GetObjectResponse, GetObjectResponse
107108

108109
if (totalParts != null && nextPartToGet > totalParts) {
109110
synchronized (lock) {
111+
logMulitpartComplete(totalParts);
110112
subscription.cancel();
111113
}
112114
}
113115

114116
GetObjectRequest actualRequest = nextRequest(nextPartToGet);
117+
log.debug(() -> "Sending GetObjectRequest for next part with partNumber=" + nextPartToGet);
115118
CompletableFuture<GetObjectResponse> getObjectFuture = s3.getObject(actualRequest, asyncResponseTransformer);
116119
getObjectFuture.whenComplete((response, error) -> {
117120
if (error != null) {
121+
log.debug(() -> "Error encountered during GetObjectRequest with partNumber=" + nextPartToGet);
118122
onError(error);
119123
return;
120124
}
121125
requestMoreIfNeeded(response);
122126
});
123127
}
124128

129+
private void logMulitpartComplete(int totalParts) {
130+
log.debug(() -> String.format("Completing multipart download after a total of %d parts downloaded.", totalParts));
131+
}
132+
125133
private void requestMoreIfNeeded(GetObjectResponse response) {
126134
int totalComplete = completedParts.incrementAndGet();
127135
MultipartDownloadUtils.multipartDownloadResumeContext(getObjectRequest)
@@ -132,16 +140,16 @@ private void requestMoreIfNeeded(GetObjectResponse response) {
132140
ctx.response(response);
133141
}
134142
});
135-
log.trace(() -> String.format("completed part: %d", totalComplete));
143+
log.debug(() -> String.format("Completed part %d", totalComplete));
136144

137145
if (eTag == null) {
138146
this.eTag = response.eTag();
139-
log.trace(() -> String.format("Multipart object ETag: %s", this.eTag));
147+
log.debug(() -> String.format("Multipart object ETag: %s", this.eTag));
140148
}
141149

142150
Integer partCount = response.partsCount();
143151
if (partCount != null && totalParts == null) {
144-
log.trace(() -> String.format("total parts: %d", partCount));
152+
log.debug(() -> String.format("Total amount of parts of the object to download: %d", partCount));
145153
MultipartDownloadUtils.multipartDownloadResumeContext(getObjectRequest)
146154
.ifPresent(ctx -> ctx.totalParts(partCount));
147155
totalParts = partCount;
@@ -150,6 +158,7 @@ private void requestMoreIfNeeded(GetObjectResponse response) {
150158
if (totalParts != null && totalParts > 1 && totalComplete < totalParts) {
151159
subscription.request(1);
152160
} else {
161+
logMulitpartComplete(totalParts);
153162
subscription.cancel();
154163
}
155164
}

0 commit comments

Comments
 (0)