Skip to content

Commit a9a68bb

Browse files
committed
Addressing PR feedback
1 parent 261d5f9 commit a9a68bb

File tree

5 files changed

+44
-22
lines changed

5 files changed

+44
-22
lines changed

core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/defaultsmode/AutoDefaultsModeDiscoveryEc2MetadataClientTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import static org.assertj.core.api.Assertions.assertThat;
2929

3030
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
31-
import java.lang.reflect.Field;
31+
import org.junit.jupiter.api.AfterAll;
3232
import org.junit.jupiter.api.AfterEach;
3333
import org.junit.jupiter.api.BeforeAll;
3434
import org.junit.jupiter.api.BeforeEach;
@@ -58,6 +58,11 @@ static void setupClass() {
5858
"http://localhost:" + wireMock.getPort());
5959
}
6060

61+
@AfterAll
62+
static void cleanupClass() {
63+
System.clearProperty(SdkSystemSetting.AWS_EC2_METADATA_SERVICE_ENDPOINT.property());
64+
}
65+
6166
@BeforeEach
6267
public void setup() {
6368
clearEnvironmentVariable("AWS_EXECUTION_ENV");

core/imds/src/main/java/software/amazon/awssdk/imds/internal/DefaultEc2MetadataClientWithFallback.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import java.io.IOException;
1919
import java.io.UncheckedIOException;
20+
import java.net.URI;
21+
import java.time.Duration;
2022
import java.time.Instant;
2123
import java.util.Optional;
2224
import java.util.concurrent.TimeUnit;
@@ -326,8 +328,8 @@ private Token getToken() {
326328
protected static final class Ec2MetadataBuilder implements Ec2MetadataClient.Builder {
327329

328330
private Ec2MetadataRetryPolicy retryPolicy;
329-
private java.net.URI endpoint;
330-
private java.time.Duration tokenTtl;
331+
private URI endpoint;
332+
private Duration tokenTtl;
331333
private EndpointMode endpointMode;
332334
private SdkHttpClient httpClient;
333335
private SdkHttpClient.Builder<?> httpClientBuilder;

core/imds/src/main/java/software/amazon/awssdk/imds/internal/Ec2MetadataSharedClient.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package software.amazon.awssdk.imds.internal;
1717

1818
import java.time.Duration;
19+
import java.util.concurrent.locks.Lock;
20+
import java.util.concurrent.locks.ReentrantLock;
1921
import software.amazon.awssdk.annotations.SdkProtectedApi;
2022
import software.amazon.awssdk.core.internal.http.loader.DefaultSdkHttpClientBuilder;
2123
import software.amazon.awssdk.http.SdkHttpClient;
@@ -31,6 +33,7 @@
3133
@SdkProtectedApi
3234
public final class Ec2MetadataSharedClient {
3335

36+
private static final Lock LOCK = new ReentrantLock();
3437
private static volatile SdkHttpClient sharedHttpClient;
3538
private static int referenceCount = 0;
3639

@@ -56,11 +59,16 @@ public static Ec2MetadataClient create() {
5659
/**
5760
* Decrements the reference count and closes the shared HTTP client if no more references exist.
5861
*/
59-
public static synchronized void decrementAndClose() {
60-
referenceCount--;
61-
if (referenceCount == 0 && sharedHttpClient != null) {
62-
sharedHttpClient.close();
63-
sharedHttpClient = null;
62+
public static void decrementAndClose() {
63+
LOCK.lock();
64+
try {
65+
referenceCount--;
66+
if (referenceCount == 0 && sharedHttpClient != null) {
67+
sharedHttpClient.close();
68+
sharedHttpClient = null;
69+
}
70+
} finally {
71+
LOCK.unlock();
6472
}
6573
}
6674

@@ -80,23 +88,27 @@ public static final class Builder {
8088
private Builder() {
8189
}
8290

83-
public synchronized Builder retryPolicy(Ec2MetadataRetryPolicy retryPolicy) {
91+
public Builder retryPolicy(Ec2MetadataRetryPolicy retryPolicy) {
8492
this.retryPolicy = retryPolicy;
8593
return this;
8694
}
8795

88-
public synchronized Ec2MetadataClient build() {
96+
public Ec2MetadataClient build() {
97+
LOCK.lock();
98+
try {
99+
if (sharedHttpClient == null) {
100+
sharedHttpClient = createImdsHttpClient();
101+
}
89102

90-
if (sharedHttpClient == null) {
91-
sharedHttpClient = createImdsHttpClient();
103+
referenceCount++;
104+
105+
return DefaultEc2MetadataClientWithFallback.builder()
106+
.httpClient(sharedHttpClient)
107+
.retryPolicy(retryPolicy)
108+
.build();
109+
} finally {
110+
LOCK.unlock();
92111
}
93-
94-
referenceCount++;
95-
96-
return DefaultEc2MetadataClientWithFallback.builder()
97-
.httpClient(sharedHttpClient)
98-
.retryPolicy(retryPolicy)
99-
.build();
100112
}
101113
}
102114
}

core/imds/src/main/java/software/amazon/awssdk/imds/internal/RequestMarshaller.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public RequestMarshaller(URI basePath) {
5050
}
5151

5252
public SdkHttpFullRequest createTokenRequest(Duration tokenTtl) {
53-
return defaulttHttpBuilder()
53+
return defaultHttpBuilder()
5454
.method(SdkHttpMethod.PUT)
5555
.uri(tokenPath)
5656
.putHeader(EC2_METADATA_TOKEN_TTL_HEADER, String.valueOf(tokenTtl.getSeconds()))
@@ -59,7 +59,7 @@ public SdkHttpFullRequest createTokenRequest(Duration tokenTtl) {
5959

6060
public SdkHttpFullRequest createDataRequest(String path, String token, Duration tokenTtl) {
6161
URI resourcePath = URI.create(basePath + path);
62-
SdkHttpFullRequest.Builder builder = defaulttHttpBuilder()
62+
SdkHttpFullRequest.Builder builder = defaultHttpBuilder()
6363
.method(SdkHttpMethod.GET)
6464
.uri(resourcePath)
6565
.putHeader(EC2_METADATA_TOKEN_TTL_HEADER, String.valueOf(tokenTtl.getSeconds()));
@@ -69,7 +69,7 @@ public SdkHttpFullRequest createDataRequest(String path, String token, Duration
6969
return builder.build();
7070
}
7171

72-
private SdkHttpFullRequest.Builder defaulttHttpBuilder() {
72+
private SdkHttpFullRequest.Builder defaultHttpBuilder() {
7373
return SdkHttpFullRequest.builder()
7474
.putHeader(USER_AGENT, SystemUserAgent.getOrCreate().userAgentString())
7575
.putHeader(ACCEPT, "*/*")

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/loader/DefaultSdkHttpClientBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323

2424
/**
2525
* Utility to load the default HTTP client factory and create an instance of {@link SdkHttpClient}.
26+
*
27+
* Implementation notes: this class should've been outside internal package,
28+
* but we can't fix it due to backwards compatibility reasons.
2629
*/
2730
@SdkProtectedApi
2831
public final class DefaultSdkHttpClientBuilder implements SdkHttpClient.Builder {

0 commit comments

Comments
 (0)