Skip to content

Commit a9e8ecb

Browse files
Add Request Timeouts (apache#1431) (apache#34)
* add timeout * add iceberg exception mapping * dont use quarkus bom, disable timeout * nits Co-authored-by: Richard Liu <35082658+RichardLiu2001@users.noreply.github.com>
1 parent e550e3b commit a9e8ecb

File tree

8 files changed

+16
-0
lines changed

8 files changed

+16
-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)

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ jetbrains-annotations = { module = "org.jetbrains:annotations", version = "26.0.
7474
junit-bom = { module = "org.junit:junit-bom", version = "5.12.0" }
7575
logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.16" }
7676
micrometer-bom = { module = "io.micrometer:micrometer-bom", version = "1.14.4" }
77+
microprofile-fault-tolerance-api = { module = "org.eclipse.microprofile.fault-tolerance:microprofile-fault-tolerance-api", version = "4.1.1" }
7778
mockito-core = { module = "org.mockito:mockito-core", version = "5.15.2" }
7879
mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version = "5.15.2" }
7980
opentelemetry-bom = { module = "io.opentelemetry:opentelemetry-bom", version = "1.47.0" }

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

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

8080
quarkus.test.integration-test-profile=it
8181

82+
quarkus.fault-tolerance.global.timeout.enabled=false
83+
# quarkus.fault-tolerance.global.timeout.unit=minutes
84+
# quarkus.fault-tolerance.global.timeout.value=10
85+
8286
polaris.realm-context.type=default
8387
polaris.realm-context.realms=POLARIS
8488
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
@@ -47,6 +47,7 @@ dependencies {
4747
implementation("io.quarkus:quarkus-micrometer-registry-prometheus")
4848
implementation("io.quarkus:quarkus-opentelemetry")
4949
implementation("io.quarkus:quarkus-smallrye-context-propagation")
50+
implementation("io.quarkus:quarkus-smallrye-fault-tolerance")
5051

5152
implementation(libs.jakarta.enterprise.cdi.api)
5253
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

@@ -107,6 +109,7 @@ public class {{classname}} {
107109
@Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
108110
@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
109111
@Timed("{{metricsPrefix}}.{{baseName}}.{{nickname}}")
112+
@Timeout
110113
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) {
111114
{{! Don't log form or header params in case there are secrets, e.g., OAuth tokens }}
112115
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
@@ -89,6 +89,8 @@ dependencies {
8989
implementation("com.azure:azure-storage-blob")
9090
implementation("com.azure:azure-storage-file-datalake")
9191

92+
implementation(libs.microprofile.fault.tolerance.api)
93+
9294
testImplementation(platform(libs.junit.bom))
9395
testImplementation("org.junit.jupiter:junit-jupiter")
9496
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
@@ -56,6 +56,7 @@
5656
import org.apache.iceberg.exceptions.UnprocessableEntityException;
5757
import org.apache.iceberg.exceptions.ValidationException;
5858
import org.apache.iceberg.rest.responses.ErrorResponse;
59+
import org.eclipse.microprofile.faulttolerance.exceptions.TimeoutException;
5960
import org.slf4j.Logger;
6061
import org.slf4j.LoggerFactory;
6162
import org.slf4j.event.Level;
@@ -198,6 +199,7 @@ static int mapExceptionToResponseCode(RuntimeException rex) {
198199
case IllegalArgumentException e -> Status.BAD_REQUEST.getStatusCode();
199200
case UnsupportedOperationException e -> Status.NOT_ACCEPTABLE.getStatusCode();
200201
case WebApplicationException e -> e.getResponse().getStatus();
202+
case TimeoutException e -> Status.REQUEST_TIMEOUT.getStatusCode();
201203
default -> Status.INTERNAL_SERVER_ERROR.getStatusCode();
202204
};
203205
}

0 commit comments

Comments
 (0)