[ https://issues.apache.org/jira/browse/POOL-418?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17924260#comment-17924260 ]
Gary D. Gregory commented on POOL-418: -------------------------------------- Hello [~sunshuai] Please accept my apologies for the delay in replying to your question. We should try to follow the duration limit as closely as possible. Do you think we should recompute the duration, as in: {code:java} diff --git a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java index 023b552..3bc15af 100644 --- a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java +++ b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java @@ -303,6 +303,7 @@ } if (blockWhenExhausted) { if (PooledObject.isNull(p)) { + remainingWaitDuration = remainingWaitDuration.minus(durationSince(startInstant)); p = negativeDuration ? idleObjects.takeFirst() : idleObjects.pollFirst(remainingWaitDuration); } if (PooledObject.isNull(p)) { {code} ? > The maximum wait time for GenericObjectPool.borrowObject(*) may exceed > expectations due to a spurious thread wakeup > ------------------------------------------------------------------------------------------------------------------- > > Key: POOL-418 > URL: https://issues.apache.org/jira/browse/POOL-418 > Project: Commons Pool > Issue Type: Bug > Reporter: SunShuai > Assignee: Gary D. Gregory > Priority: Minor > Fix For: 2.12.1 > > Attachments: 74C00A2F-EE3A-4660-BE58-66CA37F9808A.png, > EE4BD798-26B6-4AE1-B114-5AC7342B31A6.png > > > 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)