On 09/01/2017 14:29, Mark Thomas wrote:
> On 08/01/2017 22:04, Christopher Zinn wrote:

<snip/>

>>    We are running into an issue where we have multiple copies of the same
>> WAR loaded on a Tomcat instance each with its own context.xml.
>> The initial problem I was trying to diagnose was A JNDI lookup to a
>> Connection Pool in one of the WARs was returning the connection pool of one
>> of the others.
>> The problem only happens when the JNDI lookup is performed within a
>> parallelStream().
>>
>>    I was able to produce a very simple WAR with a single servlet and a
>> context XML to reproduce the problem I'm having (See below).
>>
>>    If you run the servlet from the first application, it works correctly.
>> You will see that it only ever looks up 'Test 1'.
>> When I run the servlet from the second application it will only return Test
>> 1 in the first part (stream()) but a mix of 'Test 1' and 'Test 2' in the
>> parallelStream() part.

<snip/>

> A quick look at the JRE source code suggests this is handled correctly
> but the code isn't the easiest to trace through. I'll set up the
> provided test case and take a closer look. That may take an hour or two.

I can confirm that the root cause is a JRE bug. Unless you are running
under a SecurityManager the default ForkJoinWorkerThreadFactory does not
take any steps to ensure correct operation in a multi-class loader
environment.

You have a couple of work-arounds available
- Run under a SecurityManager
- Set the java.util.concurrent.ForkJoinPool.common.threadFactory system
  property to
java.util.concurrent.ForkJoinPool.InnocuousForkJoinWorkerThreadFactory

Meanwhile, I'll be doing the following:

- Updating Tomcat's JreMemoryLeakPreventionListener to include
  protection for this memory leak.
- Adding this leak to https://github.com/markt-asf/memory-leaks
- Raising a JRE bug
- Pinging our friendly Oracle contact to get this fixed (we've been
  pretty successful at getting this fixed recently)

Cheers,

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to