Phil Steitz created POOL-420:
--------------------------------

             Summary: CLONE - The maximum wait time for 
GenericObjectPool.borrowObject(*) may exceed expectations due to a spurious 
thread wakeup
                 Key: POOL-420
                 URL: https://issues.apache.org/jira/browse/POOL-420
             Project: Commons Pool
          Issue Type: Bug
            Reporter: SunShuai
            Assignee: Gary D. Gregory
             Fix For: 2.12.1, 2.12.2


I found an issue when using jedis to operate Redis database, Here is the issue 
link -> [https://github.com/redis/jedis/issues/4014]. we feel that it's a 
problem with the Commons pool.

 

In situations where the connection is tight, the waiting time can be up to 
twice the maxWaitMillis consumption.

code: org.apache.commons.pool2.impl.GenericObjectPool#borrowObject(long) -> 
org.apache.commons.pool2.impl.GenericObjectPool#create

The thread that failed to create the connection will wake up the thread that is 
waiting to be created. Threads that do not compete for resources will wait 
again, and the waiting time will still be the maxWaitMillis.

If the first waiting time is ( maxWaitMillis - 1ms), plus the second full 
waiting time, then the full waiting time will be twice the expected time.

 

The waiting time we hope for this time is the total waiting time minus the time 
already waited.

 

such as: Duration remainingWait = 
localMaxWaitDuration.minus(Duration.between(localStartInstant, Instant.now()));

if (remainingWait.isNegative()) {

create = Boolean.FALSE;

} else {

wait(makeObjectCountLock, remainingWait);

}

 

We are not sure if this issue has been addressed and look forward to your reply.



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

Reply via email to