Skip to content

Commit 6470261

Browse files
guan46mukesh-ctds
authored andcommitted
[improve][ml] Use lock-free queue in InflightReadsLimiter since there's no concurrent access (apache#23962)
(cherry picked from commit 38a41e0) (cherry picked from commit c237cb5)
1 parent 04d88ea commit 6470261

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/cache/InflightReadsLimiter.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020

2121
import com.google.common.annotations.VisibleForTesting;
2222
import io.prometheus.client.Gauge;
23+
import java.util.ArrayDeque;
2324
import java.util.Optional;
2425
import java.util.Queue;
2526
import java.util.concurrent.ScheduledExecutorService;
2627
import java.util.concurrent.TimeUnit;
2728
import java.util.function.Consumer;
2829
import lombok.extern.slf4j.Slf4j;
29-
import org.jctools.queues.SpscArrayQueue;
3030

3131
@Slf4j
3232
public class InflightReadsLimiter {
@@ -37,6 +37,7 @@ public class InflightReadsLimiter {
3737
.help("Estimated number of bytes retained by data read from storage or cache")
3838
.register();
3939

40+
private final int maxReadsInFlightAcquireQueueSize;
4041
private static final Gauge PULSAR_ML_READS_AVAILABLE_BUFFER_SIZE = Gauge
4142
.build()
4243
.name("pulsar_ml_reads_available_inflight_bytes")
@@ -64,9 +65,10 @@ public InflightReadsLimiter(long maxReadsInFlightSize, int maxReadsInFlightAcqui
6465
this.remainingBytes = maxReadsInFlightSize;
6566
this.acquireTimeoutMillis = acquireTimeoutMillis;
6667
this.timeOutExecutor = timeOutExecutor;
68+
this.maxReadsInFlightAcquireQueueSize = maxReadsInFlightAcquireQueueSize;
6769
if (maxReadsInFlightSize > 0) {
6870
enabled = true;
69-
this.queuedHandles = new SpscArrayQueue<>(maxReadsInFlightAcquireQueueSize);
71+
this.queuedHandles = new ArrayDeque<>();
7072
} else {
7173
enabled = false;
7274
this.queuedHandles = null;
@@ -129,13 +131,14 @@ private synchronized Optional<Handle> internalAcquire(long permits, Consumer<Han
129131
updateMetrics();
130132
return Optional.of(new Handle(maxReadsInFlightSize, handle.creationTime, true));
131133
} else {
132-
if (queuedHandles.offer(new QueuedHandle(handle, callback))) {
133-
scheduleTimeOutCheck(acquireTimeoutMillis);
134-
return Optional.empty();
135-
} else {
134+
if (queuedHandles.size() >= maxReadsInFlightAcquireQueueSize) {
136135
log.warn("Failed to queue handle for acquiring permits: {}, creationTime: {}, remainingBytes:{}",
137136
permits, handle.creationTime, remainingBytes);
138137
return Optional.of(new Handle(0, handle.creationTime, false));
138+
} else {
139+
queuedHandles.offer(new QueuedHandle(handle, callback));
140+
scheduleTimeOutCheck(acquireTimeoutMillis);
141+
return Optional.empty();
139142
}
140143
}
141144
}

0 commit comments

Comments
 (0)