[ 
https://issues.apache.org/jira/browse/HBASE-29781?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18045321#comment-18045321
 ] 

Jaehui Lee commented on HBASE-29781:
------------------------------------

I'm uncertain whether this behavior is intentional or needs fixing. Is this 
something that should be addressed? If so, which approach would be most 
appropriate? Any feedback would be greatly appreciated.

> Dynamic configurations for call queue length doesn't work correctly when 
> increasing the limit
> ---------------------------------------------------------------------------------------------
>
>                 Key: HBASE-29781
>                 URL: https://issues.apache.org/jira/browse/HBASE-29781
>             Project: HBase
>          Issue Type: Bug
>          Components: rpc
>            Reporter: Jaehui Lee
>            Assignee: Jaehui Lee
>            Priority: Minor
>
> h2. Problem
> The dynamic configurations for call queue length (such as 
> {{{}ipc.server.max.callqueue.length{}}}, 
> {{{}ipc.server.priority.max.callqueue.length{}}}, 
> {{{}ipc.server.replication.max.callqueue.length{}}}, 
> {{{}ipc.server.bulkload.max.callqueue.length{}}}) only works when 
> *decreasing* the limit. When *increasing* the limit, the configuration change 
> has no effect - tasks are still rejected at the hard limit.
> *Example:*
>  * Initial configuration: {{ipc.server.max.callqueue.length = 100}}
>  * Change configuration to: {{ipc.server.max.callqueue.length = 200}}
>  * Expected: Queue accepts up to 200 tasks
>  * Actual: Queue still rejects tasks at 100
> h2. Root Cause
> {{RpcExecutor}} uses two limit mechanisms: (This was introduced by 
> HBASE-15306)
>  # *Soft limit* ({{{}currentQueueLimit{}}} variable): Updated by 
> {{resizeQueues()}} when configuration changes
>  # *Hard limit* ({{{}BlockingQueue{}}} capacity): Set once during queue 
> initialization and *cannot be changed*
>  
> During initialization, queues are created with a fixed capacity based on the 
> initial configuration value. When configuration changes, {{resizeQueues()}} 
> only updates the {{currentQueueLimit}} variable but cannot modify the 
> underlying {{BlockingQueue}} capacity, which is immutable.
> h2. Proposed Solutions
> *Option 1: Set hard limit to Integer.MAX_VALUE (or sufficiently large value)*
> Modify {{initializeQueues()}} to set the queue capacity to 
> {{Integer.MAX_VALUE}} instead of the configured value, and rely solely on 
> {{currentQueueLimit}} for enforcement. This is simple and enables dynamic 
> resizing in both directions. Note that this may allow slight overshooting of 
> the soft limit due to race conditions in concurrent dispatch.
> *Option 2: Recreate queues when increasing capacity*
> When {{resizeQueues()}} detects an increase in limit, drain existing queues 
> and create new ones with the larger capacity. This is more complex but 
> preserves hard limit safety.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to