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();
 }

Reply via email to