You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by German Castro Donoso <ge...@gmail.com> on 2008/08/01 17:20:36 UTC

Problem with pool

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?

Thanks for any help.
Germán

Re: Problem with pool

Posted by Phil Steitz <ph...@steitz.com>.
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 <ph...@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 <ph...@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


Re: Problem with pool

Posted by German Castro Donoso <ge...@gmail.com>.
I have to do something special when a validateObject fails or when I
invalidate an object?

The error always occurs after that I discard an object, but I only see one
call to invalidateObject XOR returnObject...

Germán

On Tue, Aug 5, 2008 at 5:21 AM, Phil Steitz <ph...@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 <ph...@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
>
>

Re: Problem with pool

Posted by Phil Steitz <ph...@steitz.com>.
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)

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 <ph...@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


Re: Problem with pool

Posted by German Castro Donoso <ge...@gmail.com>.
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
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 <ph...@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
>
>

Re: Problem with pool

Posted by Phil Steitz <ph...@steitz.com>.
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