This is an automated email from the ASF dual-hosted git repository.
adutra pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new df538b39 Fix RateLimiterFilter configuration (#765)
df538b39 is described below
commit df538b3928d259e9ec0339d05b12ef6c73b55a15
Author: Alexandre Dutra <[email protected]>
AuthorDate: Wed Jan 15 16:54:57 2025 +0100
Fix RateLimiterFilter configuration (#765)
The filter itself was missing some important annotations. Its configuration
has been simplified slightly as well.
---
.../service/quarkus/config/QuarkusProducers.java | 9 +++++----
... => QuarkusRateLimiterFilterConfiguration.java} | 18 ++---------------
.../QuarkusTokenBucketConfiguration.java | 23 +++++++++++-----------
.../src/main/resources/application.properties | 2 +-
.../ratelimiter/MockTokenBucketFactory.java | 4 ++--
.../quarkus/ratelimiter/RateLimiterFilterTest.java | 2 +-
.../ratelimiter/DefaultTokenBucketFactory.java | 7 ++-----
.../service/ratelimiter/RateLimiterFilter.java | 7 +++++++
...guration.java => TokenBucketConfiguration.java} | 11 +++--------
9 files changed, 35 insertions(+), 48 deletions(-)
diff --git
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java
index 66ce0969..446d7371 100644
---
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java
+++
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java
@@ -59,7 +59,8 @@ import
org.apache.polaris.service.quarkus.auth.QuarkusAuthenticationConfiguratio
import
org.apache.polaris.service.quarkus.catalog.io.QuarkusFileIOConfiguration;
import
org.apache.polaris.service.quarkus.context.QuarkusRealmContextConfiguration;
import
org.apache.polaris.service.quarkus.persistence.QuarkusPersistenceConfiguration;
-import
org.apache.polaris.service.quarkus.ratelimiter.QuarkusRateLimiterConfiguration;
+import
org.apache.polaris.service.quarkus.ratelimiter.QuarkusRateLimiterFilterConfiguration;
+import
org.apache.polaris.service.quarkus.ratelimiter.QuarkusTokenBucketConfiguration;
import org.apache.polaris.service.ratelimiter.RateLimiter;
import org.apache.polaris.service.ratelimiter.TokenBucketFactory;
import org.apache.polaris.service.task.TaskHandlerConfiguration;
@@ -186,15 +187,15 @@ public class QuarkusProducers {
@Produces
public RateLimiter rateLimiter(
- QuarkusRateLimiterConfiguration config, @Any Instance<RateLimiter>
rateLimiters) {
+ QuarkusRateLimiterFilterConfiguration config, @Any Instance<RateLimiter>
rateLimiters) {
return rateLimiters.select(Identifier.Literal.of(config.type())).get();
}
@Produces
public TokenBucketFactory tokenBucketFactory(
- QuarkusRateLimiterConfiguration config,
+ QuarkusTokenBucketConfiguration config,
@Any Instance<TokenBucketFactory> tokenBucketFactories) {
- return
tokenBucketFactories.select(Identifier.Literal.of(config.tokenBucket().type())).get();
+ return
tokenBucketFactories.select(Identifier.Literal.of(config.type())).get();
}
@Produces
diff --git
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterConfiguration.java
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterFilterConfiguration.java
similarity index 65%
rename from
quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterConfiguration.java
rename to
quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterFilterConfiguration.java
index 0a1e72de..d1a1906c 100644
---
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterConfiguration.java
+++
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusRateLimiterFilterConfiguration.java
@@ -20,28 +20,14 @@ package org.apache.polaris.service.quarkus.ratelimiter;
import io.quarkus.runtime.annotations.StaticInitSafe;
import io.smallrye.config.ConfigMapping;
-import org.apache.polaris.service.ratelimiter.RateLimiterConfiguration;
@StaticInitSafe
-@ConfigMapping(prefix = "polaris.rate-limiter")
-public interface QuarkusRateLimiterConfiguration extends
RateLimiterConfiguration {
+@ConfigMapping(prefix = "polaris.rate-limiter.filter")
+public interface QuarkusRateLimiterFilterConfiguration {
/**
* The type of the rate limiter. Must be a registered {@link
* org.apache.polaris.service.ratelimiter.RateLimiter} identifier.
*/
String type();
-
- /** The configuration for the token bucket rate limiter. */
- @Override
- QuarkusTokenBucketConfiguration tokenBucket();
-
- interface QuarkusTokenBucketConfiguration extends TokenBucketConfiguration {
-
- /**
- * The type of the token bucket factory. Must be a registered {@link
- * org.apache.polaris.service.ratelimiter.TokenBucketFactory} identifier.
- */
- String type();
- }
}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusTokenBucketConfiguration.java
similarity index 59%
copy from
service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
copy to
quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusTokenBucketConfiguration.java
index 521795ef..15967d7c 100644
---
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
+++
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/ratelimiter/QuarkusTokenBucketConfiguration.java
@@ -16,18 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.polaris.service.ratelimiter;
+package org.apache.polaris.service.quarkus.ratelimiter;
-import java.time.Duration;
+import io.quarkus.runtime.annotations.StaticInitSafe;
+import io.smallrye.config.ConfigMapping;
+import org.apache.polaris.service.ratelimiter.TokenBucketConfiguration;
-public interface RateLimiterConfiguration {
+@StaticInitSafe
+@ConfigMapping(prefix = "polaris.rate-limiter.token-bucket")
+public interface QuarkusTokenBucketConfiguration extends
TokenBucketConfiguration {
- TokenBucketConfiguration tokenBucket();
-
- interface TokenBucketConfiguration {
-
- long requestsPerSecond();
-
- Duration window();
- }
+ /**
+ * The type of the token bucket factory. Must be a registered {@link
+ * org.apache.polaris.service.ratelimiter.TokenBucketFactory} identifier.
+ */
+ String type();
}
diff --git a/quarkus/service/src/main/resources/application.properties
b/quarkus/service/src/main/resources/application.properties
index 1d7eca9b..d601ef17 100644
--- a/quarkus/service/src/main/resources/application.properties
+++ b/quarkus/service/src/main/resources/application.properties
@@ -100,7 +100,7 @@ polaris.metrics.tags.application=Polaris
# polaris.tasks.max-concurrent-tasks=100
# polaris.tasks.max-queued-tasks=1000
-polaris.rate-limiter.type=no-op
+polaris.rate-limiter.filter.type=no-op
polaris.rate-limiter.token-bucket.type=default
polaris.rate-limiter.token-bucket.requests-per-second=9999
polaris.rate-limiter.token-bucket.window=PT10S
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/MockTokenBucketFactory.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/MockTokenBucketFactory.java
index bff955c9..12e494e7 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/MockTokenBucketFactory.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/MockTokenBucketFactory.java
@@ -24,7 +24,7 @@ import jakarta.inject.Inject;
import java.time.Instant;
import java.time.ZoneOffset;
import org.apache.polaris.service.ratelimiter.DefaultTokenBucketFactory;
-import org.apache.polaris.service.ratelimiter.RateLimiterConfiguration;
+import org.apache.polaris.service.ratelimiter.TokenBucketConfiguration;
import org.threeten.extra.MutableClock;
/** TokenBucketFactory with a mock clock */
@@ -38,7 +38,7 @@ public class MockTokenBucketFactory extends
DefaultTokenBucketFactory {
}
@Inject
- public MockTokenBucketFactory(RateLimiterConfiguration configuration) {
+ public MockTokenBucketFactory(TokenBucketConfiguration configuration) {
super(configuration, CLOCK);
}
}
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/RateLimiterFilterTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/RateLimiterFilterTest.java
index 8d913b11..43edccba 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/RateLimiterFilterTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/ratelimiter/RateLimiterFilterTest.java
@@ -66,7 +66,7 @@ public class RateLimiterFilterTest {
@Override
public Map<String, String> getConfigOverrides() {
return Map.of(
- "polaris.rate-limiter.type",
+ "polaris.rate-limiter.filter.type",
"default",
"polaris.rate-limiter.token-bucket.type",
"default",
diff --git
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/DefaultTokenBucketFactory.java
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/DefaultTokenBucketFactory.java
index 9cb8bd3a..6b93cf4b 100644
---
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/DefaultTokenBucketFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/DefaultTokenBucketFactory.java
@@ -37,11 +37,8 @@ public class DefaultTokenBucketFactory implements
TokenBucketFactory {
private final Map<String, TokenBucket> perRealmBuckets = new
ConcurrentHashMap<>();
@Inject
- public DefaultTokenBucketFactory(RateLimiterConfiguration configuration,
Clock clock) {
- this(
- configuration.tokenBucket().requestsPerSecond(),
- configuration.tokenBucket().window(),
- clock);
+ public DefaultTokenBucketFactory(TokenBucketConfiguration configuration,
Clock clock) {
+ this(configuration.requestsPerSecond(), configuration.window(), clock);
}
public DefaultTokenBucketFactory(long requestsPerSecond, Duration window,
Clock clock) {
diff --git
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterFilter.java
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterFilter.java
index 99a7d1ad..3047b52f 100644
---
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterFilter.java
+++
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterFilter.java
@@ -18,9 +18,13 @@
*/
package org.apache.polaris.service.ratelimiter;
+import jakarta.annotation.Priority;
+import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
+import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.container.PreMatching;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.Provider;
import java.io.IOException;
@@ -29,6 +33,9 @@ import org.slf4j.LoggerFactory;
/** Request filter that returns a 429 Too Many Requests if the rate limiter
says so */
@Provider
+@PreMatching
+@Priority(Priorities.USER)
+@ApplicationScoped
public class RateLimiterFilter implements ContainerRequestFilter {
private static final Logger LOGGER =
LoggerFactory.getLogger(RateLimiterFilter.class);
diff --git
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/TokenBucketConfiguration.java
similarity index 82%
rename from
service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
rename to
service/common/src/main/java/org/apache/polaris/service/ratelimiter/TokenBucketConfiguration.java
index 521795ef..c48b75c8 100644
---
a/service/common/src/main/java/org/apache/polaris/service/ratelimiter/RateLimiterConfiguration.java
+++
b/service/common/src/main/java/org/apache/polaris/service/ratelimiter/TokenBucketConfiguration.java
@@ -20,14 +20,9 @@ package org.apache.polaris.service.ratelimiter;
import java.time.Duration;
-public interface RateLimiterConfiguration {
+public interface TokenBucketConfiguration {
- TokenBucketConfiguration tokenBucket();
+ long requestsPerSecond();
- interface TokenBucketConfiguration {
-
- long requestsPerSecond();
-
- Duration window();
- }
+ Duration window();
}