[ 
https://issues.apache.org/jira/browse/DBCP-600?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aryan Ganjoo updated DBCP-600:
------------------------------
    Description: 
BasicDataSource.setValidationQueryTimeout(Duration.ofMillis(100)) accepts a 
positive timeout, but PoolableConnection.validate() converts it with 
Duration.getSeconds(), yielding 0. For a configured validation query, the code 
skips Statement.setQueryTimeout; without a query, Connection.isValid(0) is 
called. In both JDBC paths, the intended bounded validation becomes effectively 
unlimited.

Steps to reproduce on current master e334782f3fa3ea182ffd1e055451f92127e765af:
1. Configure a BasicDataSource with testOnBorrow=true and 
validationQueryTimeout=Duration.ofMillis(100).
2. Use the existing TesterStatement validation fixture, whose query needs 
longer than one second.
3. Call getConnection().

Actual: validation does not time out; the connection is returned because the 
positive sub-second duration was truncated to zero.
Expected: convert a positive sub-second duration to JDBC's minimum nonzero 
timeout of one second. Zero and negative durations should retain the existing 
no-timeout behavior. The no-query Connection.isValid(int) path should likewise 
receive 1, not 0.

A focused regression failed against the unmodified base (expected SQLException, 
none thrown) and passed with the patch. The focused 
BasicDataSource/PoolableConnection tests, full mvn verify, and default mvn 
build passed locally. The fix is submitted as 
https://github.com/apache/commons-dbcp/pull/548; hosted checks and maintainer 
review are pending.

DBCP-597 concerns validation-query timeout propagation in SharedPoolDataSource 
and is distinct from this core PoolableConnection conversion path.

  was:
BasicDataSource.setValidationQueryTimeout(Duration.ofMillis(100)) accepts a 
positive timeout, but PoolableConnection.validate() converts it with 
Duration.getSeconds(), yielding 0. For a configured validation query, the code 
skips Statement.setQueryTimeout; without a query, Connection.isValid(0) is 
called. In both JDBC paths, the intended bounded validation becomes effectively 
unlimited.

Steps to reproduce on current master e334782f3fa3ea182ffd1e055451f92127e765af:
1. Configure a BasicDataSource with testOnBorrow=true and 
validationQueryTimeout=Duration.ofMillis(100).
2. Use the existing TesterStatement validation fixture, whose query needs 
longer than one second.
3. Call getConnection().

Actual: validation does not time out; the connection is returned because the 
positive sub-second duration was truncated to zero.
Expected: convert a positive sub-second duration to JDBC's minimum nonzero 
timeout of one second. Zero and negative durations should retain the existing 
no-timeout behavior. The no-query Connection.isValid(int) path should likewise 
receive 1, not 0.

A focused regression failed against the unmodified base (expected SQLException, 
none thrown) and passed with a local candidate. The focused 
BasicDataSource/PoolableConnection tests and full mvn verify also passed with 
that candidate. No pull request has been opened yet.

DBCP-597 concerns validation-query timeout propagation in SharedPoolDataSource 
and is distinct from this core PoolableConnection conversion path.


> Positive sub-second validation timeout becomes unlimited
> --------------------------------------------------------
>
>                 Key: DBCP-600
>                 URL: https://issues.apache.org/jira/browse/DBCP-600
>             Project: Commons DBCP
>          Issue Type: Bug
>            Reporter: Aryan Ganjoo
>            Priority: Major
>
> BasicDataSource.setValidationQueryTimeout(Duration.ofMillis(100)) accepts a 
> positive timeout, but PoolableConnection.validate() converts it with 
> Duration.getSeconds(), yielding 0. For a configured validation query, the 
> code skips Statement.setQueryTimeout; without a query, Connection.isValid(0) 
> is called. In both JDBC paths, the intended bounded validation becomes 
> effectively unlimited.
> Steps to reproduce on current master e334782f3fa3ea182ffd1e055451f92127e765af:
> 1. Configure a BasicDataSource with testOnBorrow=true and 
> validationQueryTimeout=Duration.ofMillis(100).
> 2. Use the existing TesterStatement validation fixture, whose query needs 
> longer than one second.
> 3. Call getConnection().
> Actual: validation does not time out; the connection is returned because the 
> positive sub-second duration was truncated to zero.
> Expected: convert a positive sub-second duration to JDBC's minimum nonzero 
> timeout of one second. Zero and negative durations should retain the existing 
> no-timeout behavior. The no-query Connection.isValid(int) path should 
> likewise receive 1, not 0.
> A focused regression failed against the unmodified base (expected 
> SQLException, none thrown) and passed with the patch. The focused 
> BasicDataSource/PoolableConnection tests, full mvn verify, and default mvn 
> build passed locally. The fix is submitted as 
> https://github.com/apache/commons-dbcp/pull/548; hosted checks and maintainer 
> review are pending.
> DBCP-597 concerns validation-query timeout propagation in 
> SharedPoolDataSource and is distinct from this core PoolableConnection 
> conversion path.



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

Reply via email to