[ https://issues.apache.org/jira/browse/POOL-418?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17924818#comment-17924818 ]
SunShuai commented on POOL-418: ------------------------------- Hi [~ggregory] I think it should be changed like this. Today I was testing version 2.12.1, and I found this issue quite obvious. The following image can prove this point. I set the maxWaitMillis to 120ms, but the total time was 240ms, with both create and pollFirst taking 120ms each. !DzZUFH2cNMwTAAAAAElFTkSuQmCC|width=688,height=179! Here's a suggestion: Before executing pollFirst, check the value of remainingWaitDuration. If it's negative, there's no need to execute pollFirst, which can save one lock operation inside pollFirst. Something like: {code:java} p = negativeDuration || remainingWaitDuration.isNegative() ? idleObjects.takeFirst() : idleObjects.pollFirst(maxWaitDuration);{code} [~ggregory] > 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)