From a28638198475efe122ed65bf7c73d4ae01ef77ce Mon Sep 17 00:00:00 2001 From: RichardLiu2001 Date: Wed, 23 Apr 2025 11:39:43 -0700 Subject: [PATCH 1/4] add timeout --- api/iceberg-service/build.gradle.kts | 3 +++ api/management-service/build.gradle.kts | 3 +++ api/polaris-catalog-service/build.gradle.kts | 3 +++ quarkus/defaults/src/main/resources/application.properties | 3 +++ quarkus/service/build.gradle.kts | 1 + server-templates/api.mustache | 3 +++ 6 files changed, 16 insertions(+) diff --git a/api/iceberg-service/build.gradle.kts b/api/iceberg-service/build.gradle.kts index 596864e7f7..3d3fd692b6 100644 --- a/api/iceberg-service/build.gradle.kts +++ b/api/iceberg-service/build.gradle.kts @@ -45,6 +45,9 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-annotations") implementation("com.fasterxml.jackson.core:jackson-core") implementation("com.fasterxml.jackson.core:jackson-databind") + + compileOnly(platform(libs.quarkus.bom)) + compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") } openApiGenerate { diff --git a/api/management-service/build.gradle.kts b/api/management-service/build.gradle.kts index 78a3b5a718..566e64bc7b 100644 --- a/api/management-service/build.gradle.kts +++ b/api/management-service/build.gradle.kts @@ -42,6 +42,9 @@ dependencies { compileOnly("io.micrometer:micrometer-core") implementation(libs.slf4j.api) + + compileOnly(platform(libs.quarkus.bom)) + compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") } openApiGenerate { diff --git a/api/polaris-catalog-service/build.gradle.kts b/api/polaris-catalog-service/build.gradle.kts index 6cd15f88a7..572308f309 100644 --- a/api/polaris-catalog-service/build.gradle.kts +++ b/api/polaris-catalog-service/build.gradle.kts @@ -71,6 +71,9 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-annotations") implementation("com.fasterxml.jackson.core:jackson-core") implementation("com.fasterxml.jackson.core:jackson-databind") + + compileOnly(platform(libs.quarkus.bom)) + compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") } openApiGenerate { diff --git a/quarkus/defaults/src/main/resources/application.properties b/quarkus/defaults/src/main/resources/application.properties index 56b18ac3dd..bb40a97be9 100644 --- a/quarkus/defaults/src/main/resources/application.properties +++ b/quarkus/defaults/src/main/resources/application.properties @@ -86,6 +86,9 @@ quarkus.otel.sdk.disabled=true quarkus.test.integration-test-profile=it +quarkus.fault-tolerance.global.timeout.unit=seconds +quarkus.fault-tolerance.global.timeout.value=60 + polaris.realm-context.type=default polaris.realm-context.realms=POLARIS polaris.realm-context.header-name=Polaris-Realm diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index 32d7ab421b..eb729b0204 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation("io.quarkus:quarkus-opentelemetry") implementation("io.quarkus:quarkus-security") implementation("io.quarkus:quarkus-smallrye-context-propagation") + implementation("io.quarkus:quarkus-smallrye-fault-tolerance") implementation(libs.jakarta.enterprise.cdi.api) implementation(libs.jakarta.inject.api) diff --git a/server-templates/api.mustache b/server-templates/api.mustache index c5f8123d86..56e5a5f123 100644 --- a/server-templates/api.mustache +++ b/server-templates/api.mustache @@ -57,6 +57,8 @@ import {{javaxPackage}}.inject.Inject; import org.apache.polaris.core.context.RealmContext; +import org.eclipse.microprofile.faulttolerance.Timeout; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,6 +83,7 @@ It is updated to remove all swagger annotations @Path("{{contextPath}}{{commonPath}}"){{#hasConsumes}} @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}} @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}} +@Timeout {{>generatedAnnotation}} {{#operations}} public class {{classname}} { From 240b9f0b5acb95ada8b810735186e9505903562d Mon Sep 17 00:00:00 2001 From: RichardLiu2001 Date: Wed, 23 Apr 2025 11:51:02 -0700 Subject: [PATCH 2/4] add iceberg exception mapping --- server-templates/api.mustache | 2 +- service/common/build.gradle.kts | 3 +++ .../polaris/service/exception/IcebergExceptionMapper.java | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/server-templates/api.mustache b/server-templates/api.mustache index 56e5a5f123..d572abee1d 100644 --- a/server-templates/api.mustache +++ b/server-templates/api.mustache @@ -83,7 +83,6 @@ It is updated to remove all swagger annotations @Path("{{contextPath}}{{commonPath}}"){{#hasConsumes}} @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}} @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}} -@Timeout {{>generatedAnnotation}} {{#operations}} public class {{classname}} { @@ -111,6 +110,7 @@ public class {{classname}} { @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}{{#hasAuthMethods}} {{#authMethods}}{{#isOAuth}}@RolesAllowed("**"){{/isOAuth}}{{/authMethods}}{{/hasAuthMethods}} @Timed("{{metricsPrefix}}.{{baseName}}.{{nickname}}") + @Timeout public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput input,{{/isMultipart}}{{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{^isMultipart}}{{>formParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}@Context @MeterTag(key="realm_id",expression="realmIdentifier") RealmContext realmContext,@Context SecurityContext securityContext) { {{! Don't log form or header params in case there are secrets, e.g., OAuth tokens }} LOGGER.atDebug().setMessage("Invoking {{baseName}} with params") diff --git a/service/common/build.gradle.kts b/service/common/build.gradle.kts index ca00893e07..8abd8ff9f6 100644 --- a/service/common/build.gradle.kts +++ b/service/common/build.gradle.kts @@ -90,6 +90,9 @@ dependencies { implementation("com.azure:azure-storage-blob") implementation("com.azure:azure-storage-file-datalake") + compileOnly(platform(libs.quarkus.bom)) + compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") + testImplementation(platform(libs.junit.bom)) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation(libs.assertj.core) diff --git a/service/common/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java b/service/common/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java index 81bfbf21f8..048da3f79d 100644 --- a/service/common/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java +++ b/service/common/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java @@ -57,6 +57,7 @@ import org.apache.iceberg.exceptions.ValidationException; import org.apache.iceberg.rest.responses.ErrorResponse; import org.apache.polaris.core.exceptions.FileIOUnknownHostException; +import org.eclipse.microprofile.faulttolerance.exceptions.TimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; @@ -191,6 +192,7 @@ static int mapExceptionToResponseCode(RuntimeException rex) { case IllegalArgumentException e -> Status.BAD_REQUEST.getStatusCode(); case UnsupportedOperationException e -> Status.NOT_ACCEPTABLE.getStatusCode(); case WebApplicationException e -> e.getResponse().getStatus(); + case TimeoutException e -> Status.REQUEST_TIMEOUT.getStatusCode(); default -> Status.INTERNAL_SERVER_ERROR.getStatusCode(); }; } From 90d675a1a69dfff6f76d4cd5585bb3ca8dcdf0f9 Mon Sep 17 00:00:00 2001 From: RichardLiu2001 Date: Thu, 24 Apr 2025 10:46:23 -0500 Subject: [PATCH 3/4] dont use quarkus bom, disable timeout --- api/iceberg-service/build.gradle.kts | 3 +-- api/management-service/build.gradle.kts | 3 +-- api/polaris-catalog-service/build.gradle.kts | 3 +-- gradle/libs.versions.toml | 1 + quarkus/defaults/src/main/resources/application.properties | 3 +-- service/common/build.gradle.kts | 5 +++-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/api/iceberg-service/build.gradle.kts b/api/iceberg-service/build.gradle.kts index 3d3fd692b6..a940a1b5e4 100644 --- a/api/iceberg-service/build.gradle.kts +++ b/api/iceberg-service/build.gradle.kts @@ -46,8 +46,7 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-core") implementation("com.fasterxml.jackson.core:jackson-databind") - compileOnly(platform(libs.quarkus.bom)) - compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") + compileOnly(libs.microprofile.fault.tolerance.api) } openApiGenerate { diff --git a/api/management-service/build.gradle.kts b/api/management-service/build.gradle.kts index 566e64bc7b..70673c65ec 100644 --- a/api/management-service/build.gradle.kts +++ b/api/management-service/build.gradle.kts @@ -43,8 +43,7 @@ dependencies { implementation(libs.slf4j.api) - compileOnly(platform(libs.quarkus.bom)) - compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") + compileOnly(libs.microprofile.fault.tolerance.api) } openApiGenerate { diff --git a/api/polaris-catalog-service/build.gradle.kts b/api/polaris-catalog-service/build.gradle.kts index 572308f309..77b801b983 100644 --- a/api/polaris-catalog-service/build.gradle.kts +++ b/api/polaris-catalog-service/build.gradle.kts @@ -72,8 +72,7 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-core") implementation("com.fasterxml.jackson.core:jackson-databind") - compileOnly(platform(libs.quarkus.bom)) - compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") + compileOnly(libs.microprofile.fault.tolerance.api) } openApiGenerate { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33193a399a..ef44554bfa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,6 +73,7 @@ javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version = "4.0 junit-bom = { module = "org.junit:junit-bom", version = "5.12.2" } logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.18" } micrometer-bom = { module = "io.micrometer:micrometer-bom", version = "1.14.6" } +microprofile-fault-tolerance-api = { module = "org.eclipse.microprofile.fault-tolerance:microprofile-fault-tolerance-api", version = "4.1.1" } mockito-core = { module = "org.mockito:mockito-core", version = "5.17.0" } mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version = "5.17.0" } opentelemetry-bom = { module = "io.opentelemetry:opentelemetry-bom", version = "1.49.0" } diff --git a/quarkus/defaults/src/main/resources/application.properties b/quarkus/defaults/src/main/resources/application.properties index bb40a97be9..df3fa326c6 100644 --- a/quarkus/defaults/src/main/resources/application.properties +++ b/quarkus/defaults/src/main/resources/application.properties @@ -86,8 +86,7 @@ quarkus.otel.sdk.disabled=true quarkus.test.integration-test-profile=it -quarkus.fault-tolerance.global.timeout.unit=seconds -quarkus.fault-tolerance.global.timeout.value=60 +quarkus.fault-tolerance.enabled=false polaris.realm-context.type=default polaris.realm-context.realms=POLARIS diff --git a/service/common/build.gradle.kts b/service/common/build.gradle.kts index 8abd8ff9f6..b0d43cacda 100644 --- a/service/common/build.gradle.kts +++ b/service/common/build.gradle.kts @@ -90,8 +90,7 @@ dependencies { implementation("com.azure:azure-storage-blob") implementation("com.azure:azure-storage-file-datalake") - compileOnly(platform(libs.quarkus.bom)) - compileOnly("io.quarkus:quarkus-smallrye-fault-tolerance") + compileOnly(libs.microprofile.fault.tolerance.api) testImplementation(platform(libs.junit.bom)) testImplementation("org.junit.jupiter:junit-jupiter") @@ -101,6 +100,8 @@ dependencies { testImplementation(libs.logback.classic) + testImplementation(libs.microprofile.fault.tolerance.api) + testFixturesImplementation(project(":polaris-core")) testFixturesImplementation(project(":polaris-api-management-model")) testFixturesImplementation(project(":polaris-api-management-service")) From 6dfe29149a740dd7e00193cd45307abe19e0efc9 Mon Sep 17 00:00:00 2001 From: RichardLiu2001 Date: Thu, 24 Apr 2025 15:32:56 -0500 Subject: [PATCH 4/4] nits --- api/management-service/build.gradle.kts | 3 +-- quarkus/defaults/src/main/resources/application.properties | 4 +++- service/common/build.gradle.kts | 4 +--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/api/management-service/build.gradle.kts b/api/management-service/build.gradle.kts index 70673c65ec..9c59b03030 100644 --- a/api/management-service/build.gradle.kts +++ b/api/management-service/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { compileOnly(libs.jakarta.annotation.api) compileOnly(libs.jakarta.inject.api) compileOnly(libs.jakarta.validation.api) + compileOnly(libs.microprofile.fault.tolerance.api) compileOnly(libs.swagger.annotations) implementation(libs.jakarta.servlet.api) @@ -42,8 +43,6 @@ dependencies { compileOnly("io.micrometer:micrometer-core") implementation(libs.slf4j.api) - - compileOnly(libs.microprofile.fault.tolerance.api) } openApiGenerate { diff --git a/quarkus/defaults/src/main/resources/application.properties b/quarkus/defaults/src/main/resources/application.properties index df3fa326c6..c7676b2ba0 100644 --- a/quarkus/defaults/src/main/resources/application.properties +++ b/quarkus/defaults/src/main/resources/application.properties @@ -86,7 +86,9 @@ quarkus.otel.sdk.disabled=true quarkus.test.integration-test-profile=it -quarkus.fault-tolerance.enabled=false +quarkus.fault-tolerance.global.timeout.enabled=false +# quarkus.fault-tolerance.global.timeout.unit=minutes +# quarkus.fault-tolerance.global.timeout.value=10 polaris.realm-context.type=default polaris.realm-context.realms=POLARIS diff --git a/service/common/build.gradle.kts b/service/common/build.gradle.kts index b0d43cacda..d38838a85c 100644 --- a/service/common/build.gradle.kts +++ b/service/common/build.gradle.kts @@ -90,7 +90,7 @@ dependencies { implementation("com.azure:azure-storage-blob") implementation("com.azure:azure-storage-file-datalake") - compileOnly(libs.microprofile.fault.tolerance.api) + implementation(libs.microprofile.fault.tolerance.api) testImplementation(platform(libs.junit.bom)) testImplementation("org.junit.jupiter:junit-jupiter") @@ -100,8 +100,6 @@ dependencies { testImplementation(libs.logback.classic) - testImplementation(libs.microprofile.fault.tolerance.api) - testFixturesImplementation(project(":polaris-core")) testFixturesImplementation(project(":polaris-api-management-model")) testFixturesImplementation(project(":polaris-api-management-service"))