diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/RateLimiterController.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/RateLimiterController.java index e17e53cf..ab08619f 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/RateLimiterController.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/RateLimiterController.java @@ -58,17 +58,20 @@ public class RateLimiterController implements TrafficShapingController { } else { // Calculate the time to wait. long waitTime = costTime + latestPassedTime.get() - TimeUtil.currentTimeMillis(); - if (waitTime >= maxQueueingTimeMs) { + if (waitTime > maxQueueingTimeMs) { return false; } else { long oldTime = latestPassedTime.addAndGet(costTime); try { waitTime = oldTime - TimeUtil.currentTimeMillis(); - if (waitTime >= maxQueueingTimeMs) { + if (waitTime > maxQueueingTimeMs) { latestPassedTime.addAndGet(-costTime); return false; } - Thread.sleep(waitTime); + // in race condition waitTime may <= 0 + if (waitTime > 0) { + Thread.sleep(waitTime); + } return true; } catch (InterruptedException e) { } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/WarmUpRateLimiterController.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/WarmUpRateLimiterController.java index 7080f4c4..ca8d953b 100644 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/WarmUpRateLimiterController.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/controller/WarmUpRateLimiterController.java @@ -68,17 +68,19 @@ public class WarmUpRateLimiterController extends WarmUpController { return true; } else { long waitTime = costTime + latestPassedTime.get() - currentTime; - if (waitTime >= timeOutInMs) { + if (waitTime > timeOutInMs) { return false; } else { long oldTime = latestPassedTime.addAndGet(costTime); try { waitTime = oldTime - TimeUtil.currentTimeMillis(); - if (waitTime >= timeOutInMs) { + if (waitTime > timeOutInMs) { latestPassedTime.addAndGet(-costTime); return false; } - Thread.sleep(waitTime); + if (waitTime > 0) { + Thread.sleep(waitTime); + } return true; } catch (InterruptedException e) { }