commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Phil Steitz <p...@steitz.com>
Subject Re: Problem with pool
Date Thu, 07 Aug 2008 01:14:07 GMT
German Castro Donoso wrote:
> I have to do something special when a validateObject fails or when I
> invalidate an object?
>   
No, you should not have to do anything special.
> The error always occurs after that I discard an object, but I only see one
> call to invalidateObject XOR returnObject...
>   
That is odd, since only these decrement numActive.  Are you sure neither 
can be executed twice on the same object without it being borrowed back 
from the pool in between?

Phil
> Germán
>
> On Tue, Aug 5, 2008 at 5:21 AM, Phil Steitz <phil@steitz.com> wrote:
>
>   
>> German Castro Donoso wrote:
>>
>>     
>>> Hi,
>>>
>>> The pool is the version 1.4
>>>
>>> The settings for the pool are:
>>>
>>>            pool = new GenericObjectPool(new PinCenterPoolFactory(), 10);
>>>            pool.setTestWhileIdle(true);
>>>            pool.setMaxIdle(5);
>>>            pool.setTimeBetweenEvictionRunsMillis(45000);
>>>
>>> pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_FAIL);
>>>
>>>
>>>
>>> The secuence of execution that I'm seeying is:
>>>
>>> 18:05:00 <DEBUG>[validateObject] Send message keepalive failed
>>> Caused by: java.net.SocketException: Connection reset
>>>    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
>>>    at java.net.SocketOutputStream.write(SocketOutputStream.java:124)
>>>    at
>>>
>>> com.sodimac.irtm.pincenter.PinConnection.sendRequest(PinConnection.java:170)
>>>    ... 6 more
>>> 18:05:03 <DEBUG>[destroyObject] Closing socket (client port=33792)
>>> 18:05:03 <DEBUG>[destroyObject] Closing socket (client port=33792)
>>> ...
>>> ...
>>> 18:24:58 <DEBUG>[getConnection-63262596] Objects in pool idle=1 active=-1
>>>
>>>       
>> What would explain both the active = -1 here and multiple clients ending up
>> with the same instances is if your client code is returning the same
>> instance twice without a borrowObject in between.  See the note here:
>> http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPool.html#returnObject(java.lang.Object)<http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPool.html#returnObject%28java.lang.Object%29>
>>
>> Phil
>>
>>
>>  18:24:58 <DEBUG>[sendRequest-63262596] Sending message (client port:35525)
>>     
>>> 18:25:00 <DEBUG>[getConnection-730089636] Objects in pool idle=0 active=0
>>> 18:25:00 <DEBUG>[validateObject] Sending keepalive message
>>> 18:25:00 <DEBUG>[sendRequest-730089636] Enviando mensaje (client
>>> port:35525)
>>> 18:25:00 <DEBUG>[sendRequest-63262596] Recibiendo mensaje (client
>>> port:35525)
>>> 18:25:01 <DEBUG>[sendRequest-730089636] Recibiendo mensaje (client
>>> port:35525)
>>> 18:25:01 <DEBUG>[close-63262596] Returning socket to pool
>>> 18:25:01 <DEBUG>[close-730089636] Returning socket to pool
>>>
>>>
>>>
>>> The main code of the pool is (I deleted some unimportants lines of code):
>>>
>>> public class PinPoolFactory implements PoolableObjectFactory
>>> {
>>>    private int numFails;
>>>
>>>    public PinPoolFactory() throws BadPropertiesException {
>>>        super();
>>>    }
>>>
>>>    public Object makeObject() throws UnknownHostException, IOException {
>>>        PinConnection con = new PinConnection();
>>>        return con;
>>>    }
>>>
>>>    public void destroyObject(Object o){
>>>        PinConnection con = (PinConnection)o;
>>>        try{
>>>            con.disconnect();
>>>        }catch(Exception e){
>>>        }
>>>    }
>>>
>>>    // Here we check that the connection is alive, first with the socket
>>> state.
>>>    // If socket is connected we have to send a "keep alive" packet to
>>> server.
>>>    public boolean validateObject(Object o){
>>>        PinConnection con = (PinConnection)o;
>>>
>>>        if(!con.isConnected()){
>>>            return false;
>>>        }
>>>
>>>        while(!con.keepAlive() && con.getFailedMessages()<numFails){
>>>            try{
>>>                con.disconnect();
>>>                con.connect();
>>>            }catch(Exception e){
>>>            }
>>>        };
>>>
>>>        if(con.getFailedMessages()!=0){
>>>            try{
>>>                con.disconnect();
>>>            }catch(Exception e){}
>>>
>>>            return false;
>>>        }
>>>
>>>        return true;
>>>    }
>>>
>>>    public void activateObject(Object o){
>>>    }
>>>
>>>    public void passivateObject(Object o){
>>>    }
>>> }
>>>
>>>
>>> Any Idea?
>>>
>>> Germán
>>>
>>> On Sun, Aug 3, 2008 at 10:20 AM, Phil Steitz <phil@steitz.com> wrote:
>>>
>>>
>>>
>>>       
>>>> German Castro Donoso wrote:
>>>>
>>>>
>>>>
>>>>         
>>>>> Hello,
>>>>>
>>>>> I have a pool that contains tcp sockets, looking the log files i've
>>>>> noticed
>>>>> that some times when a socket fails (in the validateObject function)
the
>>>>> object is destroyed... but twice. After that, when the pool recive 2
>>>>> simultaneus request for a socket, the pool give the same socket to two
>>>>> diferent clients at the same time.
>>>>>
>>>>> Anybody had have a similar problem? it's a bug in my code or a bug in
>>>>> the
>>>>> pool?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>           
>>>> What version of pool are you running?  Can you provide more info on
>>>> configuration and what you are seeing in your code?
>>>>
>>>> Phil
>>>>
>>>>
>>>>
>>>>         
>>>>> Thanks for any help.
>>>>> Germán
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>           
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>>> For additional commands, e-mail: user-help@commons.apache.org
>>>>
>>>>
>>>>
>>>>
>>>>         
>>>
>>>       
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>> For additional commands, e-mail: user-help@commons.apache.org
>>
>>
>>     
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Mime
View raw message