[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jakarta-commons-dev
Subject:    [jira] [Comment Edited] (POOL-213) _numActive can go negative
From:       "Bruno Candido Volpato da Cunha (JIRA)" <jira () apache ! org>
Date:       2012-11-30 16:07:58
Message-ID: 1801611651.45489.1354291678389.JavaMail.jiratomcat () arcas
[Download RAW message or body]


    [ https://issues.apache.org/jira/browse/POOL-213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13507394#comment-13507394 \
] 

Bruno Candido Volpato da Cunha edited comment on POOL-213 at 11/30/12 4:06 PM:
-------------------------------------------------------------------------------

Hello.

I am having this problem in Commons-Pool 1.6 too...
When I return an Object that doesn't exist in Pool (or even when I return a null), \
the numActive go negative.


{code:title=Test.java|borderStyle=solid}

	@Test
	public void testCommonsPool()  {
		GenericObjectPool<ProgressConnection> pool = \
ProgressConnectionManager.getInstance().getPool();  
		System.out.println(pool.getNumActive());
		
		try {
			ProgressConnection conn = pool.borrowObject();
			pool.returnObject(null); //null or conn have the same behavior
			pool.returnObject(null); //null or conn have the same behavior
		} catch(Exception e) {
			e.printStackTrace();
			
		}
		System.out.println(pool.getNumActive());
		
		
	}
{code} 


The result that I get is:
0
-1
                
      was (Author: brunocvcunha):
    Hello.

I am having this problem in Commons-Pool 1.6 too...
When I return an Object that doesn't exist in Pool (or even when I return a null), \
the numActive go negative.


{code:title=Test.java|borderStyle=solid}

	@Test
	public void testCommonsPool()  {
		GenericObjectPool<ProgressConnection> pool = \
ProgressConnectionManager.getInstance().getPool();  
		System.out.println(pool.getNumActive());
		
		try {
			ProgressConnection conn = pool.borrowObject();
			pool.returnObject(null);
			pool.returnObject(null);
		} catch(Exception e) {
			e.printStackTrace();
			
		}
		System.out.println(pool.getNumActive());
		
		
	}
{code} 


The result that I get is:
0
-1

                  
> _numActive can go negative
> --------------------------
> 
> Key: POOL-213
> URL: https://issues.apache.org/jira/browse/POOL-213
> Project: Commons Pool
> Issue Type: Bug
> Affects Versions: 1.5.4
> Reporter: Mark Mindenhall
> 
> I'm working on a project that uses Hector (Cassandra client).  Hector uses \
> commons-pool (we're using 1.5.4) to pool connections to hosts within a Cassandra \
> cluster.  Hector provides a JMX MBean that exposes a "NumActive" property, which is \
> the cumulative call to retrieve numActive from all of the individual connection \
> pools.  When querying this property via JMS on our production servers, we often see \
> negative values.  For example, on a server that has three connection pools, the \
> "NumActive" property reported was -3899. I know this issue has been reported before \
> (POOL-29), and was supposedly fixed.  The fix discussed there was to merely check \
> the value of _numActive to prevent it from going negative.  However, that does not \
> fix the real problem here, which is that it is possible to decrement _numActive \
> more than once for each activated object.   For example, from a quick look at the \
> code (GenericObjectPool.java, v1.5.4), it would be possible to do the following: 1) \
> Create a pool with 10 objects. 2)  Borrow all 10 objects from the pool.
> 3)  Call getNumActive (returns 10).
> 4)  Call invalidateObject for ONE of the objects 11 times.
> 5)  Call getNumActive (returns -1).
> The invalidateObject method calls the _factory to destroy the object, and \
> subsequent calls to destroy the same object may or may not result in an exception.  \
> Regardless, _numActive is decremented within a finally block, and therefore would \
> always be decremented even if the object had already been invalidated and \
> destroyed. I'd like to suggest using a HashSet instead of a counter to keep track \
> of active objects.  If borrowing an object added it to a HashSet, and returning or \
> invaliding the object removed it from the HashSet (subsequent removes would be \
> no-ops), the example given above would not result in an incorrect value when \
> getNumActive is called (it would just return the current size of the HashSet). Note \
> that although unrelated to this bug, it might also be wise to use a HashSet instead \
> of the int counter _numInternalProcessing.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic