From 72eb0f821114fccf17a483c9c09e72573ee04268 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Tue, 20 Jan 2026 11:29:41 -0800 Subject: [PATCH 1/7] set retry policy on glue client --- .../java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java | 1 + aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java | 1 + 2 files changed, 2 insertions(+) diff --git a/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java b/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java index 59a4d8d3ac38..e5646055d7aa 100644 --- a/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java +++ b/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java @@ -81,6 +81,7 @@ public GlueClient glue() { return GlueClient.builder() .applyMutation(this::applyAssumeRoleConfigurations) .applyMutation(httpClientProperties::applyHttpClientConfigurations) + .applyMutation(awsClientProperties::applyRetryConfigurations) .build(); } diff --git a/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java b/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java index 0ee4bf26e68e..85590083e1ef 100644 --- a/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java +++ b/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java @@ -148,6 +148,7 @@ public GlueClient glue() { .applyMutation(httpClientProperties::applyHttpClientConfigurations) .applyMutation(awsProperties::applyGlueEndpointConfigurations) .applyMutation(awsClientProperties::applyClientCredentialConfigurations) + .applyMutation(awsClientProperties::applyRetryConfigurations) .build(); } From ab2cb3ec4b1a7c4ef0676fb261efb16f2f3d4818 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 21 Jan 2026 15:35:41 -0800 Subject: [PATCH 2/7] add retry policy in dynamo client --- aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java | 1 + 1 file changed, 1 insertion(+) diff --git a/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java b/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java index 85590083e1ef..e6eb8d28d01a 100644 --- a/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java +++ b/aws/src/main/java/org/apache/iceberg/aws/AwsClientFactories.java @@ -170,6 +170,7 @@ public DynamoDbClient dynamo() { .applyMutation(httpClientProperties::applyHttpClientConfigurations) .applyMutation(awsClientProperties::applyClientCredentialConfigurations) .applyMutation(awsProperties::applyDynamoDbEndpointConfigurations) + .applyMutation(awsClientProperties::applyRetryConfigurations) .build(); } From 1f27bd0ad34ad0ae06cfa1738fb5f114709a2058 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 21 Jan 2026 15:36:26 -0800 Subject: [PATCH 3/7] add reflection test --- .../iceberg/aws/TestAwsClientFactories.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java index fe95f9364673..b7ebeb3d3ead 100644 --- a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java +++ b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java @@ -20,8 +20,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import java.io.IOException; +import java.lang.reflect.Field; import java.util.Map; import org.apache.iceberg.TestHelpers; import org.apache.iceberg.aws.lakeformation.LakeFormationAwsClientFactory; @@ -38,7 +40,12 @@ import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.awscore.AwsClient; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.internal.DefaultAdaptiveRetryStrategy; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.glue.GlueClient; import software.amazon.awssdk.services.glue.model.GetTablesRequest; @@ -245,6 +252,42 @@ public void testWithClassDoesNotImplementCredentialsProvider() { testProviderAndAssertThrownBy(providerClassName, containsMessage); } + @Test + public void testGlueClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + AwsClientFactory factory = + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + GlueClient glueClient = factory.glue(); + assertAwsClientSetsAdaptiveRetryPolicy(glueClient); + } + + @Test + public void testKmsClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + AwsClientFactory factory = + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + KmsClient kmsClient = factory.kms(); + assertAwsClientSetsAdaptiveRetryPolicy(kmsClient); + } + + @Test + public void testDynamoClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + AwsClientFactory factory = + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + DynamoDbClient dynamoClient = factory.dynamo(); + assertAwsClientSetsAdaptiveRetryPolicy(dynamoClient); + } + + /** + * Use reflection to extract the retry strategy from an AwsClient object, then assert that it's set to the correct + * strategy. This enforces that we correctly applied the retry configurations to the client object. + */ + private void assertAwsClientSetsAdaptiveRetryPolicy(AwsClient client) throws IllegalAccessException, NoSuchFieldException { + Field glueClientConfiguration = client.getClass().getDeclaredField("clientConfiguration"); + glueClientConfiguration.setAccessible(true); + SdkClientConfiguration sdkClientConfiguration = (SdkClientConfiguration) glueClientConfiguration.get(client); + RetryStrategy retryStrategy = sdkClientConfiguration.option(SdkClientOption.RETRY_STRATEGY); + assertInstanceOf(DefaultAdaptiveRetryStrategy.class, retryStrategy); + } + private void testProviderAndAssertThrownBy(String providerClassName, String containsMessage) { AwsClientFactory defaultAwsClientFactory = getAwsClientFactoryByCredentialsProvider(providerClassName); From 4a3bd06cca0e1178b23532d82fc4bd89919c5bfb Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 21 Jan 2026 15:45:28 -0800 Subject: [PATCH 4/7] no need for reflection --- .../iceberg/aws/TestAwsClientFactories.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java index b7ebeb3d3ead..6b651850f0d3 100644 --- a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java +++ b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java @@ -21,10 +21,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import java.lang.reflect.Field; import java.util.Map; +import java.util.Optional; import org.apache.iceberg.TestHelpers; import org.apache.iceberg.aws.lakeformation.LakeFormationAwsClientFactory; import org.apache.iceberg.aws.s3.S3FileIOProperties; @@ -41,6 +43,7 @@ import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.awscore.AwsClient; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; import software.amazon.awssdk.core.client.config.SdkClientConfiguration; import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.regions.Region; @@ -253,7 +256,7 @@ public void testWithClassDoesNotImplementCredentialsProvider() { } @Test - public void testGlueClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + public void testGlueClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); GlueClient glueClient = factory.glue(); @@ -261,7 +264,7 @@ public void testGlueClientSetsAdaptiveRetryPolicy() throws IllegalAccessExceptio } @Test - public void testKmsClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + public void testKmsClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); KmsClient kmsClient = factory.kms(); @@ -269,7 +272,7 @@ public void testKmsClientSetsAdaptiveRetryPolicy() throws IllegalAccessException } @Test - public void testDynamoClientSetsAdaptiveRetryPolicy() throws IllegalAccessException, NoSuchFieldException { + public void testDynamoClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); DynamoDbClient dynamoClient = factory.dynamo(); @@ -277,15 +280,13 @@ public void testDynamoClientSetsAdaptiveRetryPolicy() throws IllegalAccessExcept } /** - * Use reflection to extract the retry strategy from an AwsClient object, then assert that it's set to the correct - * strategy. This enforces that we correctly applied the retry configurations to the client object. + * Extract the retry strategy from an AwsClient object, then assert that it's set to the correct strategy. + * This enforces that we correctly applied the retry configurations to the client object. */ - private void assertAwsClientSetsAdaptiveRetryPolicy(AwsClient client) throws IllegalAccessException, NoSuchFieldException { - Field glueClientConfiguration = client.getClass().getDeclaredField("clientConfiguration"); - glueClientConfiguration.setAccessible(true); - SdkClientConfiguration sdkClientConfiguration = (SdkClientConfiguration) glueClientConfiguration.get(client); - RetryStrategy retryStrategy = sdkClientConfiguration.option(SdkClientOption.RETRY_STRATEGY); - assertInstanceOf(DefaultAdaptiveRetryStrategy.class, retryStrategy); + private void assertAwsClientSetsAdaptiveRetryPolicy(AwsClient client) { + Optional retryStrategy = client.serviceClientConfiguration().overrideConfiguration().retryStrategy(); + assertTrue(retryStrategy.isPresent()); + assertInstanceOf(DefaultAdaptiveRetryStrategy.class, retryStrategy.get()); } private void testProviderAndAssertThrownBy(String providerClassName, String containsMessage) { From c25ff6d82b4bb5638f2dca75ede7c9432dd5724d Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 21 Jan 2026 15:50:47 -0800 Subject: [PATCH 5/7] spotless apply --- .../iceberg/aws/TestAwsClientFactories.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java index 6b651850f0d3..638da476c1a5 100644 --- a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java +++ b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java @@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; -import java.lang.reflect.Field; import java.util.Map; import java.util.Optional; import org.apache.iceberg.TestHelpers; @@ -43,9 +42,6 @@ import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.awscore.AwsClient; -import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; -import software.amazon.awssdk.core.client.config.SdkClientConfiguration; -import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.retries.internal.DefaultAdaptiveRetryStrategy; @@ -258,7 +254,7 @@ public void testWithClassDoesNotImplementCredentialsProvider() { @Test public void testGlueClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = - getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); GlueClient glueClient = factory.glue(); assertAwsClientSetsAdaptiveRetryPolicy(glueClient); } @@ -266,7 +262,7 @@ public void testGlueClientSetsAdaptiveRetryPolicy() { @Test public void testKmsClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = - getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); KmsClient kmsClient = factory.kms(); assertAwsClientSetsAdaptiveRetryPolicy(kmsClient); } @@ -274,17 +270,19 @@ public void testKmsClientSetsAdaptiveRetryPolicy() { @Test public void testDynamoClientSetsAdaptiveRetryPolicy() { AwsClientFactory factory = - getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); + getAwsClientFactoryByCredentialsProvider(DummyValidProvider.class.getName()); DynamoDbClient dynamoClient = factory.dynamo(); assertAwsClientSetsAdaptiveRetryPolicy(dynamoClient); } /** - * Extract the retry strategy from an AwsClient object, then assert that it's set to the correct strategy. - * This enforces that we correctly applied the retry configurations to the client object. + * Extract the retry strategy from an AwsClient object, then assert that it's set to the correct + * strategy. This enforces that we correctly applied the retry configurations to the client + * object. */ private void assertAwsClientSetsAdaptiveRetryPolicy(AwsClient client) { - Optional retryStrategy = client.serviceClientConfiguration().overrideConfiguration().retryStrategy(); + Optional retryStrategy = + client.serviceClientConfiguration().overrideConfiguration().retryStrategy(); assertTrue(retryStrategy.isPresent()); assertInstanceOf(DefaultAdaptiveRetryStrategy.class, retryStrategy.get()); } From 6daaec61a62fe83d7ffee860354861e92c58e657 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 21 Jan 2026 16:10:55 -0800 Subject: [PATCH 6/7] s/junit/assertj --- .../java/org/apache/iceberg/aws/TestAwsClientFactories.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java index 638da476c1a5..94ef60e05d68 100644 --- a/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java +++ b/aws/src/test/java/org/apache/iceberg/aws/TestAwsClientFactories.java @@ -20,8 +20,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import java.util.Map; @@ -283,8 +281,8 @@ public void testDynamoClientSetsAdaptiveRetryPolicy() { private void assertAwsClientSetsAdaptiveRetryPolicy(AwsClient client) { Optional retryStrategy = client.serviceClientConfiguration().overrideConfiguration().retryStrategy(); - assertTrue(retryStrategy.isPresent()); - assertInstanceOf(DefaultAdaptiveRetryStrategy.class, retryStrategy.get()); + assertThat(retryStrategy).isPresent(); + assertThat(retryStrategy.get()).isInstanceOf(DefaultAdaptiveRetryStrategy.class); } private void testProviderAndAssertThrownBy(String providerClassName, String containsMessage) { From 52d215890c5dd66a17a6e2ce099a0280f64ade13 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Fri, 30 Jan 2026 14:46:05 -0800 Subject: [PATCH 7/7] also apply to dynamo client in AssumeRole factory --- .../java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java b/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java index e5646055d7aa..dd955d579761 100644 --- a/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java +++ b/aws/src/main/java/org/apache/iceberg/aws/AssumeRoleAwsClientFactory.java @@ -100,6 +100,7 @@ public DynamoDbClient dynamo() { .applyMutation(this::applyAssumeRoleConfigurations) .applyMutation(httpClientProperties::applyHttpClientConfigurations) .applyMutation(awsProperties::applyDynamoDbEndpointConfigurations) + .applyMutation(awsClientProperties::applyRetryConfigurations) .build(); }