You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by bu...@apache.org on 2003/08/07 21:59:34 UTC

DO NOT REPLY [Bug 22229] New: - Foul connection causes livelock of all pool operations

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22229>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22229

Foul connection causes livelock of all pool operations

           Summary: Foul connection causes livelock of all pool operations
           Product: Commons
           Version: 1.0 Final
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Critical
          Priority: Other
         Component: Dbcp
        AssignedTo: commons-dev@jakarta.apache.org
        ReportedBy: Alfred.Nathaniel@swx.com


We have a configuration where it can happen that opening a new database 
connection fouls up and gets stuck waiting for a long timeout:

Thread-2288:
  [1] oracle.jdbc.oci8.OCIDBAccess.do_open (native method)
  [2] oracle.jdbc.oci8.OCIDBAccess.logon (OCIDBAccess.java:359)
  [3] oracle.jdbc.driver.OracleConnection.<init> (OracleConnection.java:252)
  [4] oracle.jdbc.driver.OracleDriver.getConnectionInstance 
(OracleDriver.java:365)
  [5] oracle.jdbc.driver.OracleDriver.connect (OracleDriver.java:260)
  [6] org.apache.commons.dbcp.DriverConnectionFactory.createConnection 
(DriverConnectionFactory.java:83)
  [7] org.apache.commons.dbcp.PoolableConnectionFactory.makeObject 
(PoolableConnectionFactory.java:184)
  [8] org.apache.commons.pool.impl.GenericObjectPool.borrowObject (null)
  [9] org.apache.commons.dbcp.AbandonedObjectPool.borrowObject 
(AbandonedObjectPool.java:117)
  [10] org.apache.commons.dbcp.PoolingDataSource.getConnection 
(PoolingDataSource.java:110)
  [11] org.apache.commons.dbcp.BasicDataSource.getConnection 
(BasicDataSource.java:312)
  [12] swx.eservices.db.DbManager.getConnection (DbManager.java:197)
...

The problem is that during that time the foul thread holds the lock on the 
AbandonedObjectPool that all other threads doing returnObject or borrowObject 
queue:

Thread-2278:
  [1] org.apache.commons.dbcp.AbandonedObjectPool.returnObject 
(AbandonedObjectPool.java:137)
  [2] org.apache.commons.dbcp.PoolableConnection.close 
(PoolableConnection.java:110)
  [3] swx.eservices.db.DbTransaction.commit (DbTransaction.java:158)
...

So perfectly working pooled connections can no longer be returned or borrowed, 
therefore freezing all threads with database access.  One foul apple makes the 
full basket rot.

If one waits long enough (30 minutes) the do_open will finally timeout and 
everything will continue except for the failed connection.  But of course that 
timeout is far to long to go unnoticed on a webserver.

What needs to be done is to open a new connection (or do the validationQuery) 
without holding the lock on the pool.  NB borrow/returnObject in 
dbcp/AbandonedObjectPool.java was made synchronized just before the DBCP_1_0 to 
fix a threading bug (commit comment to r1.2).