Skip to content

Commit 4553e96

Browse files
authored
Reduce memory usage in S3 when plugins aren't used. (#4857)
Modifying the SDK client configuration at the request level uses extra memory, because it requires copying the existing configuration map. Before this change, we always modify the client configuration with each request to add the client instance. This change moves this modification to the client-creation, so that the configuration doesn't need to be copied unless plugins also modify the configuration. This change also removes the conditional logic that only added the client for S3, which simplifies the code generator.
1 parent bb4f4bf commit 4553e96

25 files changed

+38
-40
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "Amazon S3",
4+
"contributor": "",
5+
"description": "Reduce memory usage when request-level plugins aren't used."
6+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/AsyncClientClass.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ protected void addAdditionalMethods(TypeSpec.Builder type) {
172172
type.addMethod(isSignerOverriddenOnClientMethod());
173173
}
174174
}
175-
type.addMethod(updateSdkClientConfigurationMethod(configurationUtils.serviceClientConfigurationBuilderClassName(),
176-
"S3".equals(model.getMetadata().getServiceName())));
175+
type.addMethod(updateSdkClientConfigurationMethod(configurationUtils.serviceClientConfigurationBuilderClassName()));
177176
protocolSpec.createErrorResponseHandler().ifPresent(type::addMethod);
178177
}
179178

@@ -222,7 +221,9 @@ private MethodSpec constructor(TypeSpec.Builder classBuilder) {
222221
.addModifiers(PROTECTED)
223222
.addParameter(SdkClientConfiguration.class, "clientConfiguration")
224223
.addStatement("this.clientHandler = new $T(clientConfiguration)", AwsAsyncClientHandler.class)
225-
.addStatement("this.clientConfiguration = clientConfiguration");
224+
.addStatement("this.clientConfiguration = clientConfiguration.toBuilder()"
225+
+ ".option($T.SDK_CLIENT, this)"
226+
+ ".build()", SdkClientOption.class);
226227
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
227228
if (model.getMetadata().isJsonProtocol()) {
228229
builder.addStatement("this.$N = init($T.builder()).build()", protocolFactoryField.name,
@@ -293,8 +294,7 @@ protected MethodSpec serviceClientConfigMethod() {
293294
}
294295

295296
protected static MethodSpec updateSdkClientConfigurationMethod(
296-
TypeName serviceClientConfigurationBuilderClassName,
297-
boolean shouldAddClientReference) {
297+
TypeName serviceClientConfigurationBuilderClassName) {
298298
MethodSpec.Builder builder = MethodSpec.methodBuilder("updateSdkClientConfiguration")
299299
.addModifiers(PRIVATE)
300300
.addParameter(SdkRequest.class, "request")
@@ -306,10 +306,6 @@ protected static MethodSpec updateSdkClientConfigurationMethod(
306306
ParameterizedTypeName.get(List.class, SdkPlugin.class))
307307
.addStatement("$T configuration = clientConfiguration.toBuilder()", SdkClientConfiguration.Builder.class);
308308

309-
if (shouldAddClientReference) {
310-
builder.addStatement("configuration.option($T.SDK_CLIENT, this)", SdkClientOption.class);
311-
}
312-
313309
builder.beginControlFlow("if (plugins.isEmpty())")
314310
.addStatement("return configuration.build()")
315311
.endControlFlow()

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/SyncClientClass.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,7 @@ protected void addAdditionalMethods(TypeSpec.Builder type) {
148148
.addMethod(resolveMetricPublishersMethod());
149149

150150
protocolSpec.createErrorResponseHandler().ifPresent(type::addMethod);
151-
type.addMethod(updateSdkClientConfigurationMethod(configurationUtils.serviceClientConfigurationBuilderClassName(),
152-
"S3".equals(model.getMetadata().getServiceName())));
151+
type.addMethod(updateSdkClientConfigurationMethod(configurationUtils.serviceClientConfigurationBuilderClassName()));
153152
type.addMethod(protocolSpec.initProtocolFactory(model));
154153
}
155154

@@ -197,7 +196,9 @@ private MethodSpec constructor() {
197196
.addModifiers(PROTECTED)
198197
.addParameter(SdkClientConfiguration.class, "clientConfiguration")
199198
.addStatement("this.clientHandler = new $T(clientConfiguration)", protocolSpec.getClientHandlerClass())
200-
.addStatement("this.clientConfiguration = clientConfiguration");
199+
.addStatement("this.clientConfiguration = clientConfiguration.toBuilder()"
200+
+ ".option($T.SDK_CLIENT, this)"
201+
+ ".build()", SdkClientOption.class);
201202

202203
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
203204
if (model.getMetadata().isJsonProtocol()) {
@@ -426,8 +427,7 @@ protected MethodSpec.Builder waiterOperationBody(MethodSpec.Builder builder) {
426427
}
427428

428429
protected MethodSpec updateSdkClientConfigurationMethod(
429-
TypeName serviceClientConfigurationBuilderClassName,
430-
boolean shouldAddClientReference) {
430+
TypeName serviceClientConfigurationBuilderClassName) {
431431
MethodSpec.Builder builder = MethodSpec.methodBuilder("updateSdkClientConfiguration")
432432
.addModifiers(PRIVATE)
433433
.addParameter(SdkRequest.class, "request")
@@ -439,10 +439,6 @@ protected MethodSpec updateSdkClientConfigurationMethod(
439439
ParameterizedTypeName.get(List.class, SdkPlugin.class))
440440
.addStatement("$T configuration = clientConfiguration.toBuilder()", SdkClientConfiguration.Builder.class);
441441

442-
if (shouldAddClientReference) {
443-
builder.addStatement("configuration.option($T.SDK_CLIENT, this)", SdkClientOption.class);
444-
}
445-
446442
builder.beginControlFlow("if (plugins.isEmpty())")
447443
.addStatement("return configuration.build()")
448444
.endControlFlow()

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
133133

134134
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
135135
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
136-
this.clientConfiguration = clientConfiguration;
136+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
137137
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
138138
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
139139
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
141141

142142
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
143143
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
144-
this.clientConfiguration = clientConfiguration;
144+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
145145
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
146146
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
147147
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ final class DefaultJsonClient implements JsonClient {
100100

101101
protected DefaultJsonClient(SdkClientConfiguration clientConfiguration) {
102102
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
103-
this.clientConfiguration = clientConfiguration;
103+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
104104
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
105105
}
106106

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-query-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ final class DefaultQueryAsyncClient implements QueryAsyncClient {
103103

104104
protected DefaultQueryAsyncClient(SdkClientConfiguration clientConfiguration) {
105105
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
106-
this.clientConfiguration = clientConfiguration;
106+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
107107
this.protocolFactory = init();
108108
this.executorService = clientConfiguration.option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE);
109109
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-query-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ final class DefaultQueryClient implements QueryClient {
9494

9595
protected DefaultQueryClient(SdkClientConfiguration clientConfiguration) {
9696
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
97-
this.clientConfiguration = clientConfiguration;
97+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
9898
this.protocolFactory = init();
9999
}
100100

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-xml-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ final class DefaultXmlAsyncClient implements XmlAsyncClient {
108108

109109
protected DefaultXmlAsyncClient(SdkClientConfiguration clientConfiguration) {
110110
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
111-
this.clientConfiguration = clientConfiguration;
111+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
112112
this.protocolFactory = init();
113113
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
114114
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-xml-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ final class DefaultXmlClient implements XmlClient {
8989

9090
protected DefaultXmlClient(SdkClientConfiguration clientConfiguration) {
9191
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
92-
this.clientConfiguration = clientConfiguration;
92+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
9393
this.protocolFactory = init();
9494
}
9595

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
140140

141141
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
142142
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
143-
this.clientConfiguration = clientConfiguration;
143+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
144144
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
145145
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
146146
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-query-compatible-json-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ final class DefaultQueryToJsonCompatibleAsyncClient implements QueryToJsonCompat
6060

6161
protected DefaultQueryToJsonCompatibleAsyncClient(SdkClientConfiguration clientConfiguration) {
6262
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
63-
this.clientConfiguration = clientConfiguration;
63+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
6464
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
6565
}
6666

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-query-compatible-json-sync-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ final class DefaultQueryToJsonCompatibleClient implements QueryToJsonCompatibleC
5656

5757
protected DefaultQueryToJsonCompatibleClient(SdkClientConfiguration clientConfiguration) {
5858
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
59-
this.clientConfiguration = clientConfiguration;
59+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
6060
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
6161
}
6262

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-custompackage-async.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class DefaultProtocolRestJsonWithCustomPackageAsyncClient implements Proto
5757

5858
protected DefaultProtocolRestJsonWithCustomPackageAsyncClient(SdkClientConfiguration clientConfiguration) {
5959
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
60-
this.clientConfiguration = clientConfiguration;
60+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
6161
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
6262
}
6363

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-custompackage-sync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ final class DefaultProtocolRestJsonWithCustomPackageClient implements ProtocolRe
5353

5454
protected DefaultProtocolRestJsonWithCustomPackageClient(SdkClientConfiguration clientConfiguration) {
5555
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
56-
this.clientConfiguration = clientConfiguration;
56+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
5757
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
5858
}
5959

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-customservicemetadata-async.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class DefaultProtocolRestJsonWithCustomContentTypeAsyncClient implements P
5757

5858
protected DefaultProtocolRestJsonWithCustomContentTypeAsyncClient(SdkClientConfiguration clientConfiguration) {
5959
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
60-
this.clientConfiguration = clientConfiguration;
60+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
6161
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
6262
}
6363

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-customservicemetadata-sync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ final class DefaultProtocolRestJsonWithCustomContentTypeClient implements Protoc
5353

5454
protected DefaultProtocolRestJsonWithCustomContentTypeClient(SdkClientConfiguration clientConfiguration) {
5555
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
56-
this.clientConfiguration = clientConfiguration;
56+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
5757
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
5858
}
5959

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-endpoint-discovery-async.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ final class DefaultEndpointDiscoveryTestAsyncClient implements EndpointDiscovery
7474

7575
protected DefaultEndpointDiscoveryTestAsyncClient(SdkClientConfiguration clientConfiguration) {
7676
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
77-
this.clientConfiguration = clientConfiguration;
77+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
7878
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
7979
if (clientConfiguration.option(SdkClientOption.ENDPOINT_DISCOVERY_ENABLED)) {
8080
this.endpointDiscoveryCache = EndpointDiscoveryRefreshCache

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-endpoint-discovery-sync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ final class DefaultEndpointDiscoveryTestClient implements EndpointDiscoveryTestC
7272

7373
protected DefaultEndpointDiscoveryTestClient(SdkClientConfiguration clientConfiguration) {
7474
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
75-
this.clientConfiguration = clientConfiguration;
75+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
7676
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
7777
if (clientConfiguration.option(SdkClientOption.ENDPOINT_DISCOVERY_ENABLED)) {
7878
this.endpointDiscoveryCache = EndpointDiscoveryRefreshCache.create(EndpointDiscoveryTestEndpointDiscoveryCacheLoader

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
149149

150150
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
151151
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
152-
this.clientConfiguration = clientConfiguration;
152+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
153153
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
154154
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
155155
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ final class DefaultJsonClient implements JsonClient {
106106

107107
protected DefaultJsonClient(SdkClientConfiguration clientConfiguration) {
108108
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
109-
this.clientConfiguration = clientConfiguration;
109+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
110110
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
111111
}
112112

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-query-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ final class DefaultQueryAsyncClient implements QueryAsyncClient {
109109

110110
protected DefaultQueryAsyncClient(SdkClientConfiguration clientConfiguration) {
111111
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
112-
this.clientConfiguration = clientConfiguration;
112+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
113113
this.protocolFactory = init();
114114
this.executorService = clientConfiguration.option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE);
115115
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-query-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ final class DefaultQueryClient implements QueryClient {
9999

100100
protected DefaultQueryClient(SdkClientConfiguration clientConfiguration) {
101101
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
102-
this.clientConfiguration = clientConfiguration;
102+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
103103
this.protocolFactory = init();
104104
}
105105

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-xml-async-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ final class DefaultXmlAsyncClient implements XmlAsyncClient {
114114

115115
protected DefaultXmlAsyncClient(SdkClientConfiguration clientConfiguration) {
116116
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
117-
this.clientConfiguration = clientConfiguration;
117+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
118118
this.protocolFactory = init();
119119
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
120120
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-xml-client-class.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ final class DefaultXmlClient implements XmlClient {
9494

9595
protected DefaultXmlClient(SdkClientConfiguration clientConfiguration) {
9696
this.clientHandler = new AwsSyncClientHandler(clientConfiguration);
97-
this.clientConfiguration = clientConfiguration;
97+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
9898
this.protocolFactory = init();
9999
}
100100

0 commit comments

Comments
 (0)