Skip to content

Commit f67b109

Browse files
Code generator update for S3 CRT retry strategy config
1 parent 8e527ce commit f67b109

File tree

8 files changed

+173
-72
lines changed

8 files changed

+173
-72
lines changed

tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/s3/S3RestXmlCppClientGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ protected SdkFileEntry generateARNSourceFile(final ServiceModel serviceModel) th
624624
@Override
625625
protected SdkFileEntry generateClientConfigurationFile(final ServiceModel serviceModel) throws Exception {
626626
if ("S3-CRT".equalsIgnoreCase(serviceModel.getMetadata().getProjectName())) {
627-
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtClientConfig.vm", StandardCharsets.UTF_8.name());
627+
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtClientConfigLegacy.vm", StandardCharsets.UTF_8.name());
628628

629629
VelocityContext context = createContext(serviceModel);
630630
context.put("exportValue", String.format("AWS_%s_API", serviceModel.getMetadata().getClassNamePrefix().toUpperCase()));

tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientConfigurationHeader.vm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#if($serviceModel.metadata.serviceId == "S3" || $serviceModel.metadata.serviceId == "S3 Control")
1919
\#include <aws/core/auth/signer/AWSAuthV4Signer.h>
2020
#end
21+
#if($serviceNamespace == "S3Crt")
22+
\#include <aws/crt/io/Bootstrap.h>
23+
\#include <aws/crt/io/TlsOptions.h>
24+
\#include <aws/io/retry_strategy.h>
25+
#end
2126

2227

2328
namespace ${rootNamespace}
@@ -157,6 +162,9 @@ namespace ${rootNamespace}
157162
* $serviceModel.endpointRuleSetModel.parameters["AccountIdEndpointMode"].documentation
158163
*/
159164
Aws::String accountIdEndpointMode = "preferred";
165+
#end
166+
#if($serviceNamespace == "S3Crt")
167+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtClientConfigHeader.vm")
160168
#end
161169
private:
162170
void Load${serviceNamespace}SpecificConfig(const Aws::String& profileName);

tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientConfigurationSource.vm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
#set($endpointPrefix = $metadata.endpointPrefix)
77
#set($serviceNameCaps = $metadata.serviceId.replaceAll("[^a-zA-Z\d]+", "_").toUpperCase())
88
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ClientConfiguration.h>
9+
#if($serviceNamespace == "S3Crt")
10+
\#include <aws/core/Globals.h>
11+
\#include <aws/core/client/RetryStrategy.h>
12+
#end
913

1014
namespace ${rootNamespace}
1115
{
@@ -171,6 +175,9 @@ ${clsPrefixWSpace} ${clsPrefixWSpace}US_EAST_1_REGIONAL_ENDP
171175
Load${serviceNamespace}SpecificConfig(this->profileName);
172176
}
173177

178+
#if($serviceNamespace == "S3Crt")
179+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtClientConfigSource.vm")
180+
#end
174181

175182
} // namespace ${serviceNamespace}
176183
} // namespace ${rootNamespace}

tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtClientConfig.vm

Lines changed: 0 additions & 71 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
2+
/* S3 CRT specifics */
3+
S3CrtClientConfiguration(const S3CrtClientConfiguration&) = default;
4+
S3CrtClientConfiguration& operator=(const S3CrtClientConfiguration&) = default;
5+
6+
struct S3CrtConfigFactories
7+
{
8+
/**
9+
* CRT retry strategy factory method.
10+
* Default will try to match SDK Retry Stratgey (which defaults to DefaultRetryStrategy)
11+
* Note: CRT retry strategy is not SDK retry strategy, retry algorithm and request counting are different.
12+
*/
13+
std::function<aws_retry_strategy*(const S3Crt::S3CrtClientConfiguration&)> retryStrategyCreateFn;
14+
15+
static S3CrtConfigFactories defaultFactories;
16+
};
17+
18+
S3CrtConfigFactories crtConfigFactories = S3CrtConfigFactories::defaultFactories;
19+
20+
/** Client bootstrap used for common staples such as event loop group, host resolver, etc..
21+
* If this is nullptr, SDK will create a default one for you.
22+
*/
23+
std::shared_ptr<Aws::Crt::Io::ClientBootstrap> clientBootstrap;
24+
25+
/** Size of parts the files will be downloaded or uploaded in. Useful for Put/GetObject APIs
26+
* defaults to 5MB, if user set it to be less than 5MB, SDK will set it to 5MB.
27+
*/
28+
size_t partSize = 5 * 1024 * 1024;
29+
30+
/** TLS Options to be used for each connection.
31+
* If scheme is Https and tlsConnectionOptions is null, SDK will create a default one for you.
32+
*/
33+
std::shared_ptr<Aws::Crt::Io::TlsConnectionOptions> tlsConnectionOptions;
34+
35+
/* Throughput target in Gbps that we are trying to reach. Normally it's the NIC's throughput */
36+
double throughputTargetGbps = 2.0;
37+
38+
/** Control the maximum memory used by downloads.
39+
* When set to a value > 0, the SDK uses flow control to bring the memory usage very close
40+
* to the specified window. Without this cap, memory usage grows proportional to file size.
41+
*/
42+
size_t downloadMemoryUsageWindow = 0;
43+
44+
/* Callback and associated user data for when the client has completed its shutdown process. */
45+
std::function<void(void*)> clientShutdownCallback;
46+
void *shutdownCallbackUserData = nullptr;
47+
48+
struct CrtRetryStrategyConfig
49+
{
50+
enum class CrtRetryStrategyType
51+
{
52+
NOT_SET=0, /* Defaults to match SDK retry strategy. */
53+
DEFAULT,
54+
STANDARD,
55+
EXPONENTIAL_BACKOFF,
56+
NO_RETRY=-1,
57+
} crtRetryStrategyType = CrtRetryStrategyType::NOT_SET;
58+
59+
struct ExponentialBackoffConfig
60+
{
61+
/**
62+
* EXPONENTIAL_BACKOFF strategy config
63+
*/
64+
/* Maximum number of request retries. Specifying 0 here will fall back to the default set by aws-c-io. */
65+
size_t maxRetries = 0;
66+
67+
/* Scale factor (in milliseconds) for the back-off value. */
68+
uint32_t scaleFactorMs = 500;
69+
70+
/* Maximum delay between retries (in seconds). Specifying 0 here will fall back to the default set by aws-c-io. */
71+
uint32_t maxBackoffSecs = 20;
72+
} config;
73+
} crtRetryStrategyConfig;
74+
/* End of S3 CRT specifics */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
2+
3+
#set($metadata = $serviceModel.metadata)
4+
#set($rootNamespace = $serviceModel.namespace)
5+
#set($serviceNamespace = $metadata.namespace)
6+
#pragma once
7+
8+
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ClientConfiguration.h>
9+
10+
namespace ${rootNamespace}
11+
{
12+
namespace ${serviceNamespace}
13+
{
14+
/* Backward compatibility, please use just S3CrtClientConfiguration */
15+
using ClientConfiguration = Aws::S3Crt::S3CrtClientConfiguration;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* S3 CRT specifics */
2+
S3CrtClientConfiguration::S3CrtConfigFactories S3CrtClientConfiguration::S3CrtConfigFactories::defaultFactories = []()
3+
{
4+
S3CrtConfigFactories factories;
5+
6+
factories.retryStrategyCreateFn = [](const S3Crt::S3CrtClientConfiguration& config) -> aws_retry_strategy*
7+
{
8+
aws_event_loop_group *el_group = config.clientBootstrap ?
9+
config.clientBootstrap->GetUnderlyingHandle()->event_loop_group : Aws::GetDefaultClientBootstrap()->GetUnderlyingHandle()->event_loop_group;
10+
11+
using CrtRetryStrategyType = S3Crt::S3CrtClientConfiguration::CrtRetryStrategyConfig::CrtRetryStrategyType;
12+
13+
CrtRetryStrategyType strategyToUse = config.crtRetryStrategyConfig.crtRetryStrategyType;
14+
15+
if (strategyToUse == CrtRetryStrategyType::NOT_SET && config.retryStrategy)
16+
{
17+
if (config.retryStrategy)
18+
{
19+
if(Aws::String("standard") == config.retryStrategy->GetStrategyName())
20+
strategyToUse = CrtRetryStrategyType::STANDARD;
21+
else if(Aws::String("adaptive") == config.retryStrategy->GetStrategyName())
22+
strategyToUse = CrtRetryStrategyType::EXPONENTIAL_BACKOFF;
23+
else
24+
strategyToUse = CrtRetryStrategyType::DEFAULT;
25+
}
26+
}
27+
28+
if (strategyToUse == CrtRetryStrategyType::DEFAULT)
29+
{
30+
return nullptr;
31+
}
32+
33+
if (strategyToUse == CrtRetryStrategyType::STANDARD)
34+
{
35+
aws_standard_retry_options options {};
36+
return aws_retry_strategy_new_standard(Aws::get_aws_allocator(), &options);
37+
}
38+
39+
if (strategyToUse == CrtRetryStrategyType::EXPONENTIAL_BACKOFF)
40+
{
41+
aws_exponential_backoff_retry_options options {};
42+
options.el_group = el_group,
43+
options.max_retries = config.crtRetryStrategyConfig.config.maxRetries;
44+
options.backoff_scale_factor_ms = config.crtRetryStrategyConfig.config.scaleFactorMs;
45+
options.max_backoff_secs = config.crtRetryStrategyConfig.config.maxBackoffSecs;
46+
options.jitter_mode = AWS_EXPONENTIAL_BACKOFF_JITTER_FULL;
47+
return aws_retry_strategy_new_exponential_backoff(Aws::get_aws_allocator(), &options);
48+
}
49+
50+
if (strategyToUse == CrtRetryStrategyType::NO_RETRY)
51+
{
52+
aws_standard_retry_options options {};
53+
options.initial_bucket_capacity = 1;
54+
return aws_retry_strategy_new_standard(Aws::get_aws_allocator(), &options);
55+
}
56+
57+
return nullptr;
58+
};
59+
60+
return factories;
61+
}();
62+
/* End of S3 CRT specifics */

tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtServiceClientSourceInit.vm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ void ${className}::init(const ${clientConfigurationNamespace}::ClientConfigurati
375375
Aws::Crt::Io::ClientBootstrap* clientBootstrap = config.clientBootstrap ? config.clientBootstrap.get() : Aws::GetDefaultClientBootstrap();
376376
s3CrtConfig.client_bootstrap = clientBootstrap->GetUnderlyingHandle();
377377

378+
using CrtRetryStrategyUniquePtr = std::unique_ptr<aws_retry_strategy, decltype(&aws_retry_strategy_release)>;
379+
auto retry_strategy = CrtRetryStrategyUniquePtr(config.crtConfigFactories.retryStrategyCreateFn(config), aws_retry_strategy_release);
380+
s3CrtConfig.retry_strategy = retry_strategy.get();
381+
378382
m_crtCredProvider = Aws::Crt::Auth::CredentialsProvider::CreateCredentialsProviderDelegate({
379383
std::bind([](const std::shared_ptr<AWSCredentialsProvider>& provider) {
380384
if (provider == nullptr) {

0 commit comments

Comments
 (0)