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

0 commit comments

Comments
 (0)