You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by ma...@apache.org on 2023/02/22 20:14:04 UTC
[james-project] 07/08: When we don't get any limiter, don't build a global rate limiter
This is an automated email from the ASF dual-hosted git repository.
matthieu pushed a commit to branch refactorings-5
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit a68953fc5bee99f51d035fa82d46d2a7e74b2fc4
Author: Matthieu Baechler <ma...@baechler-craftsmanship.fr>
AuthorDate: Fri Feb 10 09:16:52 2023 +0100
When we don't get any limiter, don't build a global rate limiter
---
.../james/transport/mailets/GlobalRateLimit.scala | 30 ++++++++++++++--------
1 file changed, 20 insertions(+), 10 deletions(-)
diff --git a/server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/GlobalRateLimit.scala b/server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/GlobalRateLimit.scala
index bb83c59dce..0bd7464ad9 100644
--- a/server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/GlobalRateLimit.scala
+++ b/server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/GlobalRateLimit.scala
@@ -38,16 +38,21 @@ case class GlobalKey(keyPrefix: Option[KeyPrefix], entityType: EntityType) exten
}
}
-class GlobalRateLimiter(rateLimiter: Option[RateLimiter], keyPrefix: Option[KeyPrefix], entityType: EntityType) {
- def rateLimit(mail: Mail): Publisher[RateLimitingResult] = {
+trait GlobalRateLimiter {
+ def rateLimit(mail: Mail): Publisher[RateLimitingResult]
+}
+
+object GlobalRateLimiter {
+ def fromRateLimiter(rateLimiter: RateLimiter, keyPrefix: Option[KeyPrefix], entityType: EntityType): GlobalRateLimiter = {
val rateLimitingKey = GlobalKey(keyPrefix, entityType)
- rateLimiter.map(limiter =>
+ mail =>
EntityType.extractQuantity(entityType, mail)
- .map(increment => limiter.rateLimit(rateLimitingKey, increment))
- .getOrElse(SMono.just[RateLimitingResult](RateExceeded)))
- .getOrElse(SMono.just[RateLimitingResult](AcceptableRate))
+ .map(increment => rateLimiter.rateLimit(rateLimitingKey, increment))
+ .getOrElse(SMono.just[RateLimitingResult](RateExceeded))
}
+
+ val acceptAll: GlobalRateLimiter = mail => SMono.just[RateLimitingResult](AcceptableRate)
}
/**
@@ -140,12 +145,17 @@ class GlobalRateLimit @Inject()(rateLimiterFactory: RateLimiterFactory) extends
}
}
+
private def createRateLimiter(rateLimiterFactory: RateLimiterFactory, entityType: EntityType, keyPrefix: Option[KeyPrefix],
duration: Duration, precision: Option[Duration]): GlobalRateLimiter =
- new GlobalRateLimiter(rateLimiter = EntityType.extractRules(entityType, duration, getMailetConfig)
- .map(rateLimiterFactory.withSpecification(_, precision)),
- keyPrefix = keyPrefix,
- entityType = entityType)
+ EntityType.extractRules(entityType, duration, getMailetConfig)
+ .map(rateLimiterFactory.withSpecification(_, precision))
+ .map(rateLimiter =>
+ GlobalRateLimiter.fromRateLimiter(
+ rateLimiter = rateLimiter,
+ keyPrefix = keyPrefix,
+ entityType = entityType))
+ .getOrElse(GlobalRateLimiter.acceptAll)
override def requiredProcessingState(): util.Collection[ProcessingState] = ImmutableList.of(new ProcessingState(exceededProcessor))
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org