Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Now it's possible to configure NettyNioAsyncHttpClient for non blocking DNS #3990

Merged
merged 3 commits into from
Jun 9, 2023

Conversation

martinKindall
Copy link
Contributor

Motivation and Context

#3629

Modifications

I added a new configuration flag to allow NettyNioAsyncHttpClient under the hood to use non blocking DNS resolution.
The default behaviour remains the same, for backward compatibility. In the future it could be considered to make the non blocking resolution the default.

I used redis/lettuce#1498 as reference.

Testing

The included tests were tested running the unit tests of that module with ./mvnw package
Testing environment

Java version: 1.8.0_361, vendor: Oracle Corporation
OS name: "windows 10", version: "10.0", arch: "amd64"

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)

Checklist

  • I have read the CONTRIBUTING document
  • Local run of mvn install succeeds
  • My code follows the code style of this project
  • My change requires a change to the Javadoc documentation
  • I have updated the Javadoc documentation accordingly
  • I have added tests to cover my changes
  • All new and existing tests passed
  • I have added a changelog entry. Adding a new entry must be accomplished by running the scripts/new-change script and following the instructions. Commit the new file created by the script in .changes/next-release with your changes.
  • My change is to implement 1.11 parity feature and I have updated LaunchChangelog

License

  • I confirm that this pull request can be released under the Apache 2 license

@martinKindall martinKindall requested a review from a team as a code owner May 10, 2023 20:52
private AddressResolverGroup<InetSocketAddress> nonBlockingResolverGroup() {
DnsNameResolverBuilder builder = new DnsNameResolverBuilder()
.channelType(NioDatagramChannel.class)
.resolveCache(NoopDnsCache.INSTANCE);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the reasoning for a no-op cache, instead of the default behavior?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment mentions no caching of hostname lookups should take place
https://github.com/aws/aws-sdk-java-v2/blob/master/http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/AwaitCloseChannelPoolMap.java#L69-L70

So I thought disabling dns cache would comply that requirement.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, interesting. I think the existing DNS resolver uses the JVM's DNS cache. I don't know the context for that requirement, let me investigate further...

Copy link
Contributor

@millems millems May 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like that comment is referring to a bug we had in the past that seems unrelated to this: c0ba291

The bug was that we'd pass a resolved RemoteAddress to netty here:

This meant that any requests to the same hostname wouldn't have its DNS resolved by Netty at all. The comment was trying to prevent us from resolving the address ourselves before passing it to Netty, so that Netty would do the resolution.

I think we can still enable the DNS cache in this case, since it's essentially replacing the JVM DNS cache in the old code path, not the "cached" DNS lookup of the original bug.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment on lines 134 to 142
/**
* Configure whether to use a non-blocking dns resolver or not. False by default, as netty's default dns resolver is
* blocking; it namely calls java.net.InetAddress.getByName.
* <p>
* When enabled, a non-blocking dns resolver will be used instead, by modifying netty's bootstrap configuration.
* See https://netty.io/news/2016/05/26/4-1-0-Final.html
*/
public static final SdkHttpConfigurationOption<Boolean> USE_NONBLOCKING_DNS_RESOLVER =
new SdkHttpConfigurationOption<>("UseNonBlockingDnsResolver", Boolean.class);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's leave this off of the default options, since no other HTTP clients use it yet. Prior art:

@Override
public Builder sslProvider(SslProvider sslProvider) {
this.sslProvider = sslProvider;
return this;
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment on lines 92 to 96
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-resolver-dns</artifactId>
</dependency>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an extra 161 KB, for a feature that's off by default.

It should probably be optional for now, with updated javadoc to specify that it requires an extra dependency on netty-resolver-dns. Can we also update the error message they get if they try to enable it without the extra dependency to something like "hey, you forgot to depend on io.netty:netty-resolver-dns"? Prior art:

throw new IllegalStateException("Cannot find the " + fqcn + " class."
+ " To invoke a request that requires a SigV4a signer, such as region independent " +
"signing, the 'auth-crt' core module must be on the class path. ", e);

Copy link
Contributor Author

@martinKindall martinKindall May 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While implementing this, I stumped upon a decision: I want to reuse the ClassLoaderHelper.java class used in SignerLoader and other classes to dynamically instantiate dependencies. The problem is that this loader resides in the sdk-core module.

On the other hand, netty-nio-client does not declare this sdk module. Now I don't now if it's worth to include this dependency, if it is heavier than 161 KB then it beats the purpouse. I don't know how heavy it is, should I include it?

Other solution I thought would be just duplicate a small portion of ClassLoaderHelper.java inside the netty-nio-client, just the necessary to load classes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, we certainly can't add the dependency, since it would create a cyclic relationship. Honestly, the auth module shouldn't even be depending on ClassLoaderHelper, since it's a module-internal API.

Can you create ClassLoaderHelper in the utils module and use it from there?

We should go back and move all uses of ClassLoaderHelper from the sdk-core copy to the utils module, and deprecate-for-removal the one in sdk-core. I won't ask you to do the moving-everything-else part of it, since that seems like it should be a separate PR.

Copy link
Contributor Author

@martinKindall martinKindall May 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough, I can create create ClassLoaderHelper within utils module.

By the way, I will be away for the rest of the week, so I expect to continue on this PR starting next week. Looking forward to it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


private AddressResolverGroup<InetSocketAddress> nonBlockingResolverGroup() {
DnsNameResolverBuilder builder = new DnsNameResolverBuilder()
.channelType(NioDatagramChannel.class)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use the event loop group channel factory instead of hard-coding to NioDatagramChannels?

i.e. .channelFactory(sdkEventLoopGroup.channelFactory())

Copy link
Contributor Author

@martinKindall martinKindall May 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But the expected type is different, .channelType expects Class<? extends DatagramChannel>, and channelFactory returns
ChannelFactory<? extends Channel>. Or do you suggest I should create a channelType() method in sdkEventLoopGroup.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

channelType just delegates to channelFactory, so I was asking if we could just use channelFactory directly from this code. Now I see that channelFactory takes a ChannelFactory<? extends DatagramChannel> instead of a ChannelFactory<? extends Channel>, so my suggestion still won't work.

The concern I'm trying to fix is that in SocketChannelResolver chooses KQueue or Oio socket channels in some circumstances, and I'd like to repeat that decision-making logic for the datagram channels. Should we rename SocketChannelResolver to ChannelResolver and add a resolveDatagramChannelFactory so that we use the right datagram channel implementation for the platform?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, I'll find a way to implement that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I pushed changes that include this solution.

@martinKindall martinKindall force-pushed the non-blocking-dns branch 2 times, most recently from d6434db to 932e15c Compare May 24, 2023 21:56
method.invoke(dnsResolverObj, channelType);

Object e = addressResolver.getConstructor(dnsNameResolverBuilder).newInstance(dnsResolverObj);
return (AddressResolverGroup<InetSocketAddress>) e;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't specify a DNS Caching policy, which means the default will be used.

KNOWN_EL_GROUPS_DATAGRAMS.put("io.netty.channel.kqueue.KQueueEventLoopGroup",
"io.netty.channel.kqueue.KQueueDatagramChannel");
KNOWN_EL_GROUPS_DATAGRAMS.put("io.netty.channel.oio.OioEventLoopGroup",
"io.netty.channel.socket.oio.OioDatagramChannel");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The styling was complaining for the long lines, so I decided to split them like this.

Comment on lines 133 to 145
/**
* Creates a new instance of SdkEventLoopGroup with {@link EventLoopGroup}, {@link ChannelFactory}
* and {@link DatagramChannel} to be used with {@link NettyNioAsyncHttpClient}.
*
* @param eventLoopGroup the EventLoopGroup to be used
* @param channelFactory the channel factor to be used
* @param channelType the channel type to be used
* @return a new instance of SdkEventLoopGroup
*/
public static SdkEventLoopGroup create(EventLoopGroup eventLoopGroup, ChannelFactory<? extends Channel> channelFactory,
Class<? extends DatagramChannel> channelType) {
return new SdkEventLoopGroup(eventLoopGroup, channelFactory, channelType);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can skip adding this constructor. If people really want to configure the datagram channel type, they can do it using the builder.

Copy link
Contributor Author

@martinKindall martinKindall May 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, but then it wouldn't be possible to resolve channelType based on the eventLoopGroup, just like it's being done with the channelFactory here.

I created the constructor basically to add the channelType resolution as the 3rd parameter. What do you think?

Copy link
Contributor

@millems millems May 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm trying to avoid the pattern where we add a new constructor each time we add a new builder parameter. We generally only add a constructor if it's particularly common to create instances with that combo of params. I don't think it's particularly common for people to use the create(EventLoopGroup, ChannelFactory) method we have today, and I'd expect even less common for people to use this new one with three parameters. If you think I'm wrong, I am fine adding it.

We could still allow for resolving the channelType based on the eventLoopGroup by keeping things private.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You were right, I could resolve the datagramChannelFactory internally using the already existing constructors, so no additional constructor was added.

I modified the builder to allow configuration of channel factories.

Changed pushed.

Comment on lines 114 to 107
/**
* @return the {@link ChannelFactory} to be used with Netty Http Client.
*/
public Class<? extends DatagramChannel> channelType() {
return channelType;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we do ChannelFactory<? extends DatagramChannel> datagramChannelFactory() to be symmetric with the other channel factory? We'd use that type everywhere in here.

It would also avoid the overhead of the ReflectiveChannelFactory's reflection whenever channels are created.

Copy link
Contributor Author

@martinKindall martinKindall May 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That wouldn't be possible, I tried changing the signature but, as an example, NioSocketChannel::new doesn't satisfy the type ChannelFactory<? extends DatagramChannel>.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you mean NioDatagramChannel::new? What doesn't work about it? I haven't tried it, but it seems like it should be fine...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, now I see what you meant. Alright, changes pushed.

Comment on lines 16 to 22
package software.amazon.awssdk.utils.internal;


import software.amazon.awssdk.annotations.SdkInternalApi;

@SdkInternalApi
public final class ClassLoaderHelper {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Let's move this to software.amazon.awssdk.utils and mark it as an @SdkProtectedApi.

@martinKindall martinKindall force-pushed the non-blocking-dns branch 2 times, most recently from 07c9e3c to bf944e1 Compare May 30, 2023 21:40
Copy link
Contributor

@millems millems left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work! A few minor non-functional comments. I'll kick off the testing now. Once the tests are passing and we close out those last comments, I'll merge!

Comment on lines 730 to 738
@Override
public Builder useNonBlockingDnsResolver(boolean useNonBlockingDnsResolver) {
this.useNonBlockingDnsResolver = useNonBlockingDnsResolver;
return this;
}

public void setUseNonBlockingDnsResolver(boolean useNonBlockingDnsResolver) {
useNonBlockingDnsResolver(useNonBlockingDnsResolver);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we use boxed types (Boolean) for configuration, so that we can differentiate between null ("use default") and false (disable). It's useful if we ever need to change the defaults in the future.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment on lines 42 to 43
Method method = dnsResolverObj.getClass().getMethod("channelType", Class.class);
method.invoke(dnsResolverObj, datagramChannelFactory.newChannel().getClass());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More efficient:

Method method = dnsResolverObj.getClass().getMethod("channelFactory", ChannelFactory.class);
method.invoke(dnsResolverObj, datagramChannelFactory);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

I added more tests to increase coverage.

@martinKindall martinKindall force-pushed the non-blocking-dns branch 2 times, most recently from 489a66b to bac3ae4 Compare May 31, 2023 23:56
@millems
Copy link
Contributor

millems commented Jun 5, 2023

I've merged master into your branch and have kicked off the automated tests.

@millems
Copy link
Contributor

millems commented Jun 6, 2023

Tests are passing! Thanks for your contribution. We'll have to do some additional testing to make sure this new optional dependency will work with our release automation. Once that testing is complete, we'll merge.

@millems
Copy link
Contributor

millems commented Jun 6, 2023

Can you merge in the millem/master/import-non-blocking-dns branch from the upstream repo? It adds import configuration for the new dns dependency. Once you've done that, I'll merge this PR!

b35e9ad

@martinKindall
Copy link
Contributor Author

Can you merge in the millem/master/import-non-blocking-dns branch from the upstream repo? It adds import configuration for the new dns dependency. Once you've done that, I'll merge this PR!

b35e9ad

Done.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Jun 6, 2023

SonarCloud Quality Gate failed.    Quality Gate failed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 18 Code Smells

55.8% 55.8% Coverage
9.2% 9.2% Duplication

@millems millems merged commit 43505cc into aws:master Jun 9, 2023
@millems
Copy link
Contributor

millems commented Jun 9, 2023

Thank you for your contribution! I've merged the change, and it will go out with the next regular SDK release.

davidh44 added a commit that referenced this pull request Jun 21, 2023
* Fixed issue with leased connection leaks when threads executing HTTP … (#4066)

* Fixed issue with leased connection leaks when threads executing HTTP connections with Apache HttpClient were interrupted while the connection was in progress.

* Added logic in MakeHttpRequestStage to check and abort request if interrupted

* Add test cases for UrlConnectionHttpClient

* Moved the fix to AfterTransmissionExecutionInterceptorsStage to just close the stream instaed of aborting the reqyest in MakeHttpRequestStage

* Removing test cases related to UrlConnectionHttp since adding depenency in protocol-test for urlConnectionClient cause failues since it uses default Client all the places

* Updated after Zoe's comments

* Now it's possible to configure NettyNioAsyncHttpClient for non blocking DNS (#3990)

* Now it's possible to configure NettyNioAsyncHttpClient in order to use a
non blocking DNS resolver.

* Add package mapping for netty-resolver-dns.

---------

Co-authored-by: Matthew Miller <millem@amazon.com>

* Amazon Connect Service Update: This release adds search APIs for Prompts, Quick Connects and Hours of Operations, which can be used to search for those resources within a Connect Instance.

* AWS Certificate Manager Private Certificate Authority Update: Document-only update to refresh CLI documentation for AWS Private CA. No change to the service.

* Release 2.20.83. Updated CHANGELOG.md, README.md and all pom.xml.

* Add "unsafe" AsyncRequestBody constructors for byte[] and ByteBuffers (#3925)

* Update to next snapshot version: 2.20.84-SNAPSHOT

* Use WeakHashMap in IdleConenctionReaper  (#4087)

* Use WeakHashMap in IdleConenctionReaper to not prevent connection manager from getting GC'd

* Checkstyle fix

* Update S3IntegrationTestBase.java (#4079)

* Amazon Rekognition Update: This release adds support for improved accuracy with user vector in Amazon Rekognition Face Search. Adds new APIs: AssociateFaces, CreateUser, DeleteUser, DisassociateFaces, ListUsers, SearchUsers, SearchUsersByImage. Also adds new face metadata that can be stored: user vector.

* Amazon DynamoDB Update: Documentation updates for DynamoDB

* Amazon FSx Update: Amazon FSx for NetApp ONTAP now supports joining a storage virtual machine (SVM) to Active Directory after the SVM has been created.

* Amazon SageMaker Service Update: Sagemaker Neo now supports compilation for inferentia2 (ML_INF2) and Trainium1 (ML_TRN1) as available targets. With these devices, you can run your workloads at highest performance with lowest cost. inferentia2 (ML_INF2) is available in CMH and Trainium1 (ML_TRN1) is available in IAD currently

* AWS Amplify UI Builder Update: AWS Amplify UIBuilder is launching Codegen UI, a new feature that enables you to generate your amplify uibuilder components and forms.

* Amazon OpenSearch Service Update: This release adds support for SkipUnavailable connection property for cross cluster search

* Amazon DynamoDB Streams Update: Documentation updates for DynamoDB Streams

* Updated endpoints.json and partitions.json.

* Release 2.20.84. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.85-SNAPSHOT

* docs: add scrocquesel as a contributor for code (#4091)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Debora N. Ito <476307+debora-ito@users.noreply.github.com>

* AWS CloudTrail Update: This feature allows users to view dashboards for CloudTrail Lake event data stores.

* AWS WAFV2 Update: You can now detect and block fraudulent account creation attempts with the new AWS WAF Fraud Control account creation fraud prevention (ACFP) managed rule group AWSManagedRulesACFPRuleSet.

* AWS Well-Architected Tool Update: AWS Well-Architected now supports Profiles that help customers prioritize which questions to focus on first by providing a list of prioritized questions that are better aligned with their business goals and outcomes.

* Amazon Lightsail Update: This release adds pagination for the Get Certificates API operation.

* Amazon Verified Permissions Update: GA release of Amazon Verified Permissions.

* EC2 Image Builder Update: Change the Image Builder ImagePipeline dateNextRun field to more accurately describe the data.

* Amazon CodeGuru Security Update: Initial release of Amazon CodeGuru Security APIs

* Amazon Simple Storage Service Update: Integrate double encryption feature to SDKs.

* Elastic Disaster Recovery Service Update: Added APIs to support network replication and recovery using AWS Elastic Disaster Recovery.

* AWS SimSpace Weaver Update: This release fixes using aws-us-gov ARNs in API calls and adds documentation for snapshot APIs.

* AWS SecurityHub Update: Add support for Security Hub Automation Rules

* Amazon Elastic Compute Cloud Update: This release introduces a new feature, EC2 Instance Connect Endpoint, that enables you to connect to a resource over TCP, without requiring the resource to have a public IPv4 address.

* Updated endpoints.json and partitions.json.

* Release 2.20.85. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.86-SNAPSHOT

* Create secondary indices based on table bean annotations (#3923) (#4004)

* Create secondary indices based on table bean annotations (#3923)

* detect and group indices present in table schema into LSIs and GSIs
* pass request with indices information appended further

* Remove specifying provisioned throughput for GSIs (#3923)

* If there's no information about the billing mode of the new table,
  then it'll be using the PAY_PER_REQUEST one. It means that all
  GSIs related to this table will be doing the same and there's
  no need to hard code any provisioned throughput like it was done

* Allow passing empty indices list to CreateTableOperation (#3923)

* CreateTableRequest cannot handle empty list of indices of any type. It
  throws exception when given such a list. At the same time, it nicely
  handles the cases when indices lists are null. Make sure then that
  when empty indices list is passed CreateTableOperation, then in the
  CreateTableRequest it's just reflected as null.

---------

Co-authored-by: Adrian Chlebosz <Adrian.Chlebosz@stepstone.com>
Co-authored-by: Olivier L Applin <olapplin@amazon.com>

* Add EnhancedType parameters to static builder methods of StaticTableSchema and StaticImmitableTableSchema (#4077)

* Amazon Elastic File System Update: Documentation updates for EFS.

* Amazon GuardDuty Update: Updated descriptions for some APIs.

* Amazon Location Service Update: Amazon Location Service adds categories to places, including filtering on those categories in searches. Also, you can now add metadata properties to your geofences.

* AWS Audit Manager Update: This release introduces 2 Audit Manager features: CSV exports and new manual evidence options. You can now export your evidence finder results in CSV format. In addition, you can now add manual evidence to a control by entering free-form text or uploading a file from your browser.

* Updated endpoints.json and partitions.json.

* Release 2.20.86. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.87-SNAPSHOT

* EnumAttributeConverter: enums can be identified by toString() or name(). toString() is the default for backward compatibility (#3971)

Co-authored-by: Zoe Wang <33073555+zoewangg@users.noreply.github.com>

* AWS Application Discovery Service Update: Add Amazon EC2 instance recommendations export

* AWS Account Update: Improve pagination support for ListRegions

* Amazon Simple Storage Service Update: This release adds SDK support for request-payer request header and request-charged response header in the "GetBucketAccelerateConfiguration", "ListMultipartUploads", "ListObjects", "ListObjectsV2" and "ListObjectVersions" S3 APIs.

* Amazon Connect Service Update: Updates the *InstanceStorageConfig APIs to support a new ResourceType: SCREEN_RECORDINGS to enable screen recording and specify the storage configurations for publishing the recordings. Also updates DescribeInstance and ListInstances APIs to include InstanceAccessUrl attribute in the API response.

* AWS Identity and Access Management Update: Documentation updates for AWS Identity and Access Management (IAM).

* Release 2.20.87. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.88-SNAPSHOT

* Fix the StackOverflowException in WaiterExecutor in case of large retries count. (#3956)

* Move checksum calculation from afterMarshalling to modifyHttpRequest (#4108)

* Update HttpChecksumRequiredInterceptor

* Update HttpChecksumInHeaderInterceptor

* Update tests and remove constant

* Add back constant to resolve japicmp

* Add back javadocs

* docs: add dave-fn as a contributor for code (#4092)

* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

* Removing unnecessary vscode file

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Debora N. Ito <476307+debora-ito@users.noreply.github.com>

* Amazon Route 53 Domains Update: Update MaxItems upper bound to 1000 for ListPricesRequest

* Amazon EC2 Container Service Update: Documentation only update to address various tickets.

* AWS CloudFormation Update: Specify desired CloudFormation behavior in the event of ChangeSet execution failure using the CreateChangeSet OnStackFailure parameter

* AWS Price List Service Update: This release updates the PriceListArn regex pattern.

* AWS Glue Update: This release adds support for creating cross region table/database resource links

* Amazon Elastic Compute Cloud Update: API changes to AWS Verified Access to include data from trust providers in logs

* Amazon SageMaker Service Update: Amazon Sagemaker Autopilot releases CreateAutoMLJobV2 and DescribeAutoMLJobV2 for Autopilot customers with ImageClassification, TextClassification and Tabular problem type config support.

* Release 2.20.88. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.89-SNAPSHOT

* AWS Lambda Update: This release adds RecursiveInvocationException to the Invoke API and InvokeWithResponseStream API.

* AWS Config Update: Updated ResourceType enum with new resource types onboarded by AWS Config in May 2023.

* Amazon Appflow Update: This release adds new API to reset connector metadata cache

* Amazon Elastic Compute Cloud Update: Adds support for targeting Dedicated Host allocations by assetIds in AWS Outposts

* Amazon Redshift Update: Added support for custom domain names for Redshift Provisioned clusters. This feature enables customers to create a custom domain name and use ACM to generate fully secure connections to it.

* Updated endpoints.json and partitions.json.

* Release 2.20.89. Updated CHANGELOG.md, README.md and all pom.xml.

* Update to next snapshot version: 2.20.90-SNAPSHOT

* Move QueryParametersToBodyInterceptor to front of interceptor chain (#4109)

* Move QueryParametersToBodyInterceptor to front of interceptor chain

* Move customization.config interceptors to front of interceptor chain - for query protocols

* Refactoring

* Add codegen tests

* Refactoring

* Refactoring

---------

Co-authored-by: John Viegas <70235430+joviegas@users.noreply.github.com>
Co-authored-by: Martin <mart256@gmail.com>
Co-authored-by: Matthew Miller <millem@amazon.com>
Co-authored-by: AWS <>
Co-authored-by: aws-sdk-java-automation <43143862+aws-sdk-java-automation@users.noreply.github.com>
Co-authored-by: Stephen Flavin <stephenflavin@outlook.com>
Co-authored-by: Zoe Wang <33073555+zoewangg@users.noreply.github.com>
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Debora N. Ito <476307+debora-ito@users.noreply.github.com>
Co-authored-by: Adrian Chlebosz <36669019+breader124@users.noreply.github.com>
Co-authored-by: Adrian Chlebosz <Adrian.Chlebosz@stepstone.com>
Co-authored-by: Olivier L Applin <olapplin@amazon.com>
Co-authored-by: Benjamin Maizels <36682168+bmaizels@users.noreply.github.com>
Co-authored-by: flitt <55669857+flittev@users.noreply.github.com>
L-Applin pushed a commit that referenced this pull request Jul 24, 2023
…ng DNS (#3990)

* Now it's possible to configure NettyNioAsyncHttpClient in order to use a
non blocking DNS resolver.

* Add package mapping for netty-resolver-dns.

---------

Co-authored-by: Matthew Miller <millem@amazon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants