You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Phil Steitz (JIRA)" <ji...@apache.org> on 2011/03/20 20:50:06 UTC
[jira] [Updated] (POOL-184) Premature starvation in
GenericObjectPool when borrowObject() and evict() are executed concurrently
[ https://issues.apache.org/jira/browse/POOL-184?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Phil Steitz updated POOL-184:
-----------------------------
Fix Version/s: 1.5.6
> Premature starvation in GenericObjectPool when borrowObject() and evict() are executed concurrently
> ---------------------------------------------------------------------------------------------------
>
> Key: POOL-184
> URL: https://issues.apache.org/jira/browse/POOL-184
> Project: Commons Pool
> Issue Type: Bug
> Affects Versions: 1.5.5
> Environment: java 1.6.0_24
> Ubuntu 10.10
> Reporter: Adrian Nistor
> Fix For: 1.5.6
>
> Attachments: Test01.java, stall.txt
>
>
> Hi,
> I am encountering a deadlock in GenericObjectPool. It appears in version 1.5.5
> and also in revision 1079385 (March 8th 2011).
> The deadlock manifests when calling borrowObject() and evict() in parallel. I
> have inlined a test that exposes this problem. For this test, the expected
> output is:
> Expected output:
> 0
> 1
> 2
> 3
> 4
> .....
> 498
> 499
> DONE
> But when the bug manifests (almost always for this test), the output is:
> Bug output:
> 0
> 1
> 2
> 3
> 4
> When the bug manifests, the test does not finish, it just gets stuck after
> printing several values (in this run: 0 1 2 3 4, but in other runs may be
> 0 1 2 .. 18 or 0 1 2 or some other value).
> When the loop limit is small (e.g., 11 instead of 5000), the test does finish.
> Also, when running sequentially:
>
> Pool.borrowObject();
> Pool.evict();
> or vice-versa
> Pool.evict();
> Pool.borrowObject();
> the test still finishes.
> Is this a bug? Is there a patch for it?
> Thanks!
> Adrian
> ================================================================================
> This test is for version 1.5.5. For revision 1079385 one should replace
> setMaxActive() with setMaxTotal()
> ================================================================================
> package org.apache.commons.pool.impl;
> import org.apache.commons.pool.PoolableObjectFactory;
> public class Test01
> {
> public static void main(String[] args) throws Exception
> {
> Test01 test = new Test01();
> test.test();
> }
>
> SimpleFactory Factory = null;
> GenericObjectPool Pool = null;
> Object Obj = null;
> public void test() throws Exception
> {
> Factory = new SimpleFactory();
> Pool = new GenericObjectPool(Factory);
> Pool.setMaxActive(1);
> Pool.addObject();
>
> for(int i=0; i<5000; i++)
> {
> Thread one = new MyThread(1);
> Thread two = new MyThread(2);
> one.start();
> two.start();
> one.join();
> two.join();
>
> Pool.returnObject(Obj);
> if(i%10==0)
> {
> System.out.println(i/10);
> }
> }
> System.out.println("DONE");
> }
> private class MyThread extends Thread
> {
> int _tid;
> public MyThread(int tid)
> {
> _tid = tid;
> }
> public void run()
> {
> try
> {
> if(_tid == 1)
> {
> Obj = Pool.borrowObject();
> }
> if (_tid == 2)
> {
> try
> {
> Pool.evict();
> } catch (Exception e) {}
> }
> }
> catch(Exception e)
> {
> throw new RuntimeException(e);
> }
> }
> }
> private class SimpleFactory implements PoolableObjectFactory
> {
> public SimpleFactory() {}
> public Object makeObject() { return new String("testing"); }
> public void destroyObject(Object obj) {}
> public boolean validateObject(Object obj) {return true;}
> public void activateObject(Object obj) throws Exception {}
> public void passivateObject(Object obj) throws Exception {}
> public boolean isThrowExceptionOnActivate() {return true;}
> }
> }
> ================================================================================
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira