@@ -365,13 +365,13 @@ class RequestChannel(val queueSize: Int,
365
365
// AutoMQ inject start
366
366
/**
367
367
* Queue of requests to be handled, in the order they arrived.
368
- * Note: Before any request enters this queue, it needs to acquire {@link multiQueuedRequestSizeSemaphore }
368
+ * Note: Before any request enters this queue, it needs to acquire {@link queuedRequestSizeSemaphore }
369
369
*/
370
370
private val multiRequestQueue = new java.util.ArrayList [ArrayBlockingQueue [BaseRequest ]]()
371
371
/**
372
372
* Semaphore to limit the total size of requests in the {@link multiRequestQueue}.
373
373
*/
374
- private val multiQueuedRequestSizeSemaphore = new java.util. ArrayList [ Semaphore ]( )
374
+ private val queuedRequestSizeSemaphore = new Semaphore (queuedRequestSize )
375
375
private val availableRequestSizeMetricName = metricNamePrefix.concat(AvailableRequestSizeMetric )
376
376
// AutoMQ inject end
377
377
private val processors = new ConcurrentHashMap [Int , Processor ]()
@@ -390,7 +390,7 @@ class RequestChannel(val queueSize: Int,
390
390
}
391
391
})
392
392
metricsGroup.newGauge(availableRequestSizeMetricName, () => {
393
- multiQueuedRequestSizeSemaphore.stream().mapToInt(s => s. availablePermits()).sum ()
393
+ queuedRequestSizeSemaphore. availablePermits()
394
394
})
395
395
396
396
def this (queueSize : Int , metricNamePrefix : String , time : Time , metrics : RequestChannel .Metrics ) {
@@ -415,13 +415,8 @@ class RequestChannel(val queueSize: Int,
415
415
// AutoMQ inject start
416
416
def registerNRequestHandler (count : Int ): Unit = {
417
417
val queueSize = math.max(this .queueSize / count, 1 )
418
- // TODO: maxQueuedRequestSize will be 100 / 8 = 12.5 MiB as a default.
419
- // However, if the request size is too large, it will block at the semaphore.
420
- // Currently, the max request size is 1 MiB (max.request.size) by default, so it is not very problematic.
421
- val maxQueuedRequestSize = math.max(this .queuedRequestSize / count, 10 * 1024 * 1024 )
422
418
for (_ <- 0 until count) {
423
419
multiRequestQueue.add(new ArrayBlockingQueue [BaseRequest ](queueSize))
424
- multiQueuedRequestSizeSemaphore.add(new Semaphore (maxQueuedRequestSize))
425
420
multiCallbackQueue.add(new ArrayBlockingQueue [BaseRequest ](queueSize))
426
421
}
427
422
Collections .unmodifiableList(multiRequestQueue)
@@ -436,8 +431,7 @@ class RequestChannel(val queueSize: Int,
436
431
/** Send a request to be handled, potentially blocking until there is room in the queue for the request */
437
432
def sendRequest (request : RequestChannel .Request ): Unit = {
438
433
if (multiRequestQueue.size() != 0 ) {
439
- val requestSizeSemaphore = multiQueuedRequestSizeSemaphore.get(math.abs(request.context.connectionId.hashCode % multiQueuedRequestSizeSemaphore.size()))
440
- requestSizeSemaphore.acquire(request.sizeInBytes)
434
+ queuedRequestSizeSemaphore.acquire(Math .min(request.sizeInBytes, queuedRequestSize))
441
435
val requestQueue = multiRequestQueue.get(math.abs(request.context.connectionId.hashCode % multiRequestQueue.size()))
442
436
requestQueue.put(request)
443
437
} else {
@@ -544,7 +538,6 @@ class RequestChannel(val queueSize: Int,
544
538
def receiveRequest (timeout : Long , id : Int ): RequestChannel .BaseRequest = {
545
539
val callbackQueue = multiCallbackQueue.get(id)
546
540
val requestQueue = multiRequestQueue.get(id)
547
- val requestSizeSemaphore = multiQueuedRequestSizeSemaphore.get(id)
548
541
val callbackRequest = callbackQueue.poll()
549
542
if (callbackRequest != null )
550
543
callbackRequest
@@ -553,7 +546,7 @@ class RequestChannel(val queueSize: Int,
553
546
request match {
554
547
case WakeupRequest => callbackQueue.poll()
555
548
case request : Request =>
556
- requestSizeSemaphore .release(request.sizeInBytes)
549
+ queuedRequestSizeSemaphore .release(Math .min( request.sizeInBytes, queuedRequestSize) )
557
550
request
558
551
case _ => request
559
552
}
0 commit comments