From 75eaa0bffe86306c5df7a52c42ee41b7c7dc24c1 Mon Sep 17 00:00:00 2001 From: guanziyue <30882822+guanziyue@users.noreply.github.com> Date: Mon, 9 May 2022 10:27:37 +0800 Subject: [PATCH] [HUDI-4055]refactor ratelimiter to avoid stack overflow (#5530) --- .../apache/hudi/common/util/RateLimiter.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/hudi-common/src/main/java/org/apache/hudi/common/util/RateLimiter.java b/hudi-common/src/main/java/org/apache/hudi/common/util/RateLimiter.java index e156ccffd..4915e454a 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/util/RateLimiter.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/util/RateLimiter.java @@ -53,19 +53,22 @@ public class RateLimiter { } public boolean tryAcquire(int numPermits) { - if (numPermits > maxPermits) { - acquire(maxPermits); - return tryAcquire(numPermits - maxPermits); - } else { - return acquire(numPermits); + int remainingPermits = numPermits; + while (remainingPermits > 0) { + if (remainingPermits > maxPermits) { + acquire(maxPermits); + remainingPermits -= maxPermits; + } else { + return acquire(remainingPermits); + } } + return true; } public boolean acquire(int numOps) { try { - if (!semaphore.tryAcquire(numOps)) { + while (!semaphore.tryAcquire(numOps)) { Thread.sleep(WAIT_BEFORE_NEXT_ACQUIRE_PERMIT_IN_MS); - return acquire(numOps); } LOG.debug(String.format("acquire permits: %s, maxPremits: %s", numOps, maxPermits)); } catch (InterruptedException e) {