On 2/20/07, Jörg Schaible <[EMAIL PROTECTED]> wrote:

Hi Phil,

Phil Steitz wrote:

> On 2/15/07, Jörg Schaible <[EMAIL PROTECTED]> wrote:
>>
>> Hi Phil,
>>
>> sorry I am late and I downloaded the source package, compiled and run
all
>> tests in Gentoo Linux with Maven for Sun JDK 1.4.2, Sun JDK 1.5.0,
>> Blackdown JDK 1.4.2_03, IBM JDK 1.4.2.7, and IBM JDK 1.5.0.3 and all
>> tests run fine for these.
>>
>> It fails for JRockit 1.4.2.11 and 1.5.0.6 though with:
>> ============================== %< ==================
>> Testsuite: org.apache.commons.dbcp.TestBasicDataSource
>> Tests run: 33, Failures: 1, Errors: 0, Time elapsed: 4,364 sec
>>
>> Testcase:
>> testCreateDataSourceCleanupThreads(
>> org.apache.commons.dbcp.TestBasicDataSource):
>> FAILED
>> expected:<1> but was:<2>
>> junit.framework.AssertionFailedError: expected:<1> but was:<2>
>>         at
>>
>>

org.apache.commons.dbcp.TestBasicDataSource.testCreateDataSourceCleanupThreads
>> (TestBasicDataSource.java:334)
>>         at jrockit.reflect.VirtualNativeMethodInvoker.invoke(
>> Ljava.lang.Object
>> [Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)
>> ============================== %< ==================
>
>
> Ugh.  The test that is failing is to confirm  the fix for DBCP-93, which
> is
> essentially a thread leak.  In retrospect, it was probably not a good
idea
> to include a check of the form assertEquals(threadCount,
> Thread.activeCount()), as appears in this test, since Thread.activeCount
> is not really guaranteed
> to be accurate.  In the case of JRockit, the docs mention something to
the
> effect of monitoring threads being spawned periodically.  Before the
fix,
> the test case would have orphaned 10 threads, post fix JRockit is
> reporting
> one extra thread.  I think it is best to do something to fix this, but
am
> not sure what would be best.  Eliminating the test is one option, or
> changing the test to allow one or two extra threads would also work.  I
> see this as a blocker, since this test was introduced in 1.2.2 and the
> build
> should succeed on JRockit.  Any suggestions?

When I try to run the tests from within Eclipse with the JRockit JDK,
anything works. OTOH when I tried to run the tests yesterday with Maven
under heavy load of my machine (compiling KOffice), the test succeeded
also, but two others were failing :-/ Nevertheless, the test above fails
on "normal" terms always on my machine with Maven/JRockit, so it at least
repeatable.

I looked at the test, but it seems I don't grok from a quick look enough
of
the internals of dbcp to say anything useful. Since I have some experience
with other concurrent tests, what about joining the evictor thread and
wait
for it to stop (at least for a reasonable time)? If it has a unique name,
you can address it from the test ...


The test is to demonstrate that the "thread leak" reported in DBCP-93 is
fixed.  From the bug report:

"In the BasicDataSource.createDataSource method, if the datasource was
previously un-initialized, a new GenericObjectPool (or AbandonedObjectPool
depending on configuration) is always instantiated.

The GenericObjectPool constructor (and also the call to
setTimeBetweenEvictionRunsMillis()) starts a new thread for the Evictor.
This
thread runs until it's cancel() is called.

The problem is that if a SQLException is thrown when the
PoolableConnectionFactory is instantiated (like with a bad user/pass), the
exception is rethrown, but no attempt is made to clean up the Evictor thread

that was started in the GenericObjectPool, so that thread just keeps running

forever. Since this happens before the datasource was created, the next call

to getConnection() will again attempt to re-initialize the datasource in
createDataSource(), and if the same error happens again, another Evictor
thread
will be left running, -> repeat a few thousand times and it starts to bring
down systems."

The bug was fixed and the test is to demonstrate that the above scenario
does not occur.  Before the fix, 10 threads would be orphaned by the test
code.  Joining and waiting on the threads is an interesting idea.
Unfortunately, I don't see any way to get references to them.   Any better
ideas than the hack-ish solution of allowing the count to be off by one or
two would be appreciated.

Phil

Reply via email to