diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/glue/GlueMetastoreModule.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/glue/GlueMetastoreModule.java index 9315be4a575e..b5c9c1f13b4c 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/glue/GlueMetastoreModule.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/glue/GlueMetastoreModule.java @@ -44,6 +44,7 @@ import software.amazon.awssdk.services.glue.GlueClient; import software.amazon.awssdk.services.glue.GlueClientBuilder; import software.amazon.awssdk.services.glue.model.ConcurrentModificationException; +import software.amazon.awssdk.services.glue.model.ThrottlingException; import software.amazon.awssdk.services.sts.StsClient; import software.amazon.awssdk.services.sts.StsClientBuilder; import software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider; @@ -151,7 +152,7 @@ public static GlueClient createGlueClient(GlueHiveMetastoreConfig config, @ForGl glue.overrideConfiguration(builder -> builder .executionInterceptors(ImmutableList.copyOf(executionInterceptors)) .retryStrategy(retryBuilder -> retryBuilder - .retryOnException(throwable -> throwable instanceof ConcurrentModificationException) + .retryOnException(throwable -> throwable instanceof ConcurrentModificationException || throwable instanceof ThrottlingException) .backoffStrategy(BackoffStrategy.exponentialDelay( java.time.Duration.ofMillis(20), java.time.Duration.ofMillis(1500))) diff --git a/plugin/trino-iceberg/pom.xml b/plugin/trino-iceberg/pom.xml index ac2c09e338d7..a5f792e242aa 100644 --- a/plugin/trino-iceberg/pom.xml +++ b/plugin/trino-iceberg/pom.xml @@ -454,6 +454,11 @@ kms runtime + + software.amazon.awssdk + retries-spi + runtime + software.amazon.awssdk diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java index 91007870f6d7..3c0c4c25ea12 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java @@ -35,12 +35,17 @@ import io.trino.spi.security.PrincipalType; import io.trino.spi.security.TrinoPrincipal; import org.junit.jupiter.api.Test; +import software.amazon.awssdk.retries.api.BackoffStrategy; import software.amazon.awssdk.services.glue.GlueClient; +import software.amazon.awssdk.services.glue.GlueClientBuilder; +import software.amazon.awssdk.services.glue.model.ConcurrentModificationException; +import software.amazon.awssdk.services.glue.model.ThrottlingException; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.time.Duration; import java.util.List; import java.util.Map; import java.util.Optional; @@ -86,7 +91,7 @@ protected void createNamespaceWithProperties(TrinoCatalog catalog, String namesp private TrinoCatalog createGlueTrinoCatalog(boolean useUniqueTableLocations, boolean useSystemSecurity) { - GlueClient glueClient = GlueClient.create(); + GlueClient glueClient = createGlueClient(); IcebergGlueCatalogConfig catalogConfig = new IcebergGlueCatalogConfig(); return new TrinoGlueCatalog( new CatalogName("catalog_name"), @@ -110,6 +115,18 @@ private TrinoCatalog createGlueTrinoCatalog(boolean useUniqueTableLocations, boo directExecutor()); } + private static GlueClient createGlueClient() + { + GlueClientBuilder glue = GlueClient.builder(); + + glue.overrideConfiguration(builder -> builder + .retryStrategy(retryBuilder -> retryBuilder + .retryOnException(throwable -> throwable instanceof ConcurrentModificationException || throwable instanceof ThrottlingException) + .backoffStrategy(BackoffStrategy.exponentialDelay(Duration.ofMillis(20), Duration.ofMillis(1500))) + .maxAttempts(10))); + return glue.build(); + } + /** * Similar to {@link #testNonLowercaseNamespace()}, but creates the Glue database via Glue API, in case Glue starts allowing non-lowercase names. */