As the 'inversed' locking order in evict() is obviously the source of the problems, I would try to avoid calling any _factory methods while holding the 'this' lock.

I thinking about something like this:

public void evict() {
  CursorableLinkedList tmpPool;
  Collection connsToEvict = new ArrayList();
  synchronized(this) {
    tmpPool = new CursorableLinkedList(_pool);
  }

  // checking for conns to evict, calling methods on _factory and adding
  // conns to evict to connsToEvict

  synchronized(this) {
    // remove conns in connsToEvict from _pool
    // ignoring conns that are (currently) not in pool
  }
 }

Obviuosly, this doesn't work with the evictionCursor as it is implemented now, so it would require some work on that one.

just my 2 cents,
Christoph

Phil Steitz wrote:
Pool 1.4 has made DBCP-44 worse. The synchronization changes
implemented to address other issues in pool 1.4 have created more
opportunities for Evictor / client contention for locks on the pool
and factory-related objects.  The stack trace added to DBCP-44 on
27-feb-08 shows a new deadlock.  That particular issue could be
resolved by (re-)combining the last two synchronized blocks in
addObjectToPool, but that has some performance downside and there may
be other exposures.

While the DBCP side of this (DBCP-44) needs work as well, I think we
need to do something like the above to patch pool.  More eyeballs on
this appreciated.  I will open a pool ticket to track once I have done
some more testing.

Phil

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to