From 8a3eae9e031059484cd41fc1447f0ffeea4c6b23 Mon Sep 17 00:00:00 2001 From: alextheimer Date: Thu, 6 Feb 2025 20:43:20 -0800 Subject: [PATCH] fix(memstore): fix flaky rate-limiter test (#1948) --- core/src/main/scala/filodb.core/RateLimiter.scala | 9 +++++---- core/src/test/scala/filodb.core/RateLimiterSpec.scala | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/filodb.core/RateLimiter.scala b/core/src/main/scala/filodb.core/RateLimiter.scala index 9cb739903..f703f7fb8 100644 --- a/core/src/main/scala/filodb.core/RateLimiter.scala +++ b/core/src/main/scala/filodb.core/RateLimiter.scala @@ -8,7 +8,7 @@ import scala.concurrent.duration.Duration * period has elapsed since the previous success. */ class RateLimiter(period: Duration) { - private var lastSuccessMillis = 0L; + private var lastSuccessNanos = 0L; /** * Returns true to indicate an attempt was "successful", else it was "failed". @@ -20,9 +20,10 @@ class RateLimiter(period: Duration) { * may be acceptable in some use-cases). */ def attempt(): Boolean = { - val nowMillis = System.currentTimeMillis() - if (nowMillis - lastSuccessMillis > period.toMillis) { - lastSuccessMillis = nowMillis + // Using nanoTime() because it is monotonic. + val nowNanos = System.nanoTime() + if (nowNanos - lastSuccessNanos > period.toNanos) { + lastSuccessNanos = nowNanos return true } false diff --git a/core/src/test/scala/filodb.core/RateLimiterSpec.scala b/core/src/test/scala/filodb.core/RateLimiterSpec.scala index f05799473..34331bcba 100644 --- a/core/src/test/scala/filodb.core/RateLimiterSpec.scala +++ b/core/src/test/scala/filodb.core/RateLimiterSpec.scala @@ -10,7 +10,7 @@ import scala.concurrent.duration.Duration class RateLimiterSpec extends AnyFunSpec with Matchers { it("should apply rate-limits accordingly") { - val rateLimiter = new RateLimiter(Duration(2, TimeUnit.SECONDS)) + val rateLimiter = new RateLimiter(Duration(1, TimeUnit.SECONDS)) // First attempt should succeed. rateLimiter.attempt() shouldEqual true