Skip to content

Commit a303a1d

Browse files
Add Request Timeouts (#1431)
* add timeout * add iceberg exception mapping * dont use quarkus bom, disable timeout * nits
1 parent 250bdec commit a303a1d

File tree

9 files changed

+18
-0
lines changed

9 files changed

+18
-0
lines changed

api/iceberg-service/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ dependencies {
4545
implementation("com.fasterxml.jackson.core:jackson-annotations")
4646
implementation("com.fasterxml.jackson.core:jackson-core")
4747
implementation("com.fasterxml.jackson.core:jackson-databind")
48+
49+
compileOnly(libs.microprofile.fault.tolerance.api)
4850
}
4951

5052
openApiGenerate {

api/management-service/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ dependencies {
3333
compileOnly(libs.jakarta.annotation.api)
3434
compileOnly(libs.jakarta.inject.api)
3535
compileOnly(libs.jakarta.validation.api)
36+
compileOnly(libs.microprofile.fault.tolerance.api)
3637
compileOnly(libs.swagger.annotations)
3738

3839
implementation(libs.jakarta.servlet.api)

api/polaris-catalog-service/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ dependencies {
7171
implementation("com.fasterxml.jackson.core:jackson-annotations")
7272
implementation("com.fasterxml.jackson.core:jackson-core")
7373
implementation("com.fasterxml.jackson.core:jackson-databind")
74+
75+
compileOnly(libs.microprofile.fault.tolerance.api)
7476
}
7577

7678
openApiGenerate {

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version = "4.0
7373
junit-bom = { module = "org.junit:junit-bom", version = "5.12.2" }
7474
logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.18" }
7575
micrometer-bom = { module = "io.micrometer:micrometer-bom", version = "1.14.6" }
76+
microprofile-fault-tolerance-api = { module = "org.eclipse.microprofile.fault-tolerance:microprofile-fault-tolerance-api", version = "4.1.1" }
7677
mockito-core = { module = "org.mockito:mockito-core", version = "5.17.0" }
7778
mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version = "5.17.0" }
7879
opentelemetry-bom = { module = "io.opentelemetry:opentelemetry-bom", version = "1.49.0" }

quarkus/defaults/src/main/resources/application.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ quarkus.otel.sdk.disabled=true
8686

8787
quarkus.test.integration-test-profile=it
8888

89+
quarkus.fault-tolerance.global.timeout.enabled=false
90+
# quarkus.fault-tolerance.global.timeout.unit=minutes
91+
# quarkus.fault-tolerance.global.timeout.value=10
92+
8993
polaris.realm-context.type=default
9094
polaris.realm-context.realms=POLARIS
9195
polaris.realm-context.header-name=Polaris-Realm

quarkus/service/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ dependencies {
5555
implementation("io.quarkus:quarkus-opentelemetry")
5656
implementation("io.quarkus:quarkus-security")
5757
implementation("io.quarkus:quarkus-smallrye-context-propagation")
58+
implementation("io.quarkus:quarkus-smallrye-fault-tolerance")
5859

5960
implementation(libs.jakarta.enterprise.cdi.api)
6061
implementation(libs.jakarta.inject.api)

server-templates/api.mustache

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ import {{javaxPackage}}.inject.Inject;
5757

5858
import org.apache.polaris.core.context.RealmContext;
5959

60+
import org.eclipse.microprofile.faulttolerance.Timeout;
61+
6062
import org.slf4j.Logger;
6163
import org.slf4j.LoggerFactory;
6264

@@ -108,6 +110,7 @@ public class {{classname}} {
108110
@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}{{#hasAuthMethods}}
109111
{{#authMethods}}{{#isOAuth}}@RolesAllowed("**"){{/isOAuth}}{{/authMethods}}{{/hasAuthMethods}}
110112
@Timed("{{metricsPrefix}}.{{baseName}}.{{nickname}}")
113+
@Timeout
111114
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) {
112115
{{! Don't log form or header params in case there are secrets, e.g., OAuth tokens }}
113116
LOGGER.atDebug().setMessage("Invoking {{baseName}} with params")

service/common/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ dependencies {
9090
implementation("com.azure:azure-storage-blob")
9191
implementation("com.azure:azure-storage-file-datalake")
9292

93+
implementation(libs.microprofile.fault.tolerance.api)
94+
9395
testImplementation(platform(libs.junit.bom))
9496
testImplementation("org.junit.jupiter:junit-jupiter")
9597
testImplementation(libs.assertj.core)

service/common/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.iceberg.exceptions.ValidationException;
5858
import org.apache.iceberg.rest.responses.ErrorResponse;
5959
import org.apache.polaris.core.exceptions.FileIOUnknownHostException;
60+
import org.eclipse.microprofile.faulttolerance.exceptions.TimeoutException;
6061
import org.slf4j.Logger;
6162
import org.slf4j.LoggerFactory;
6263
import org.slf4j.event.Level;
@@ -191,6 +192,7 @@ static int mapExceptionToResponseCode(RuntimeException rex) {
191192
case IllegalArgumentException e -> Status.BAD_REQUEST.getStatusCode();
192193
case UnsupportedOperationException e -> Status.NOT_ACCEPTABLE.getStatusCode();
193194
case WebApplicationException e -> e.getResponse().getStatus();
195+
case TimeoutException e -> Status.REQUEST_TIMEOUT.getStatusCode();
194196
default -> Status.INTERNAL_SERVER_ERROR.getStatusCode();
195197
};
196198
}

0 commit comments

Comments
 (0)