The max-connections property configures the maximum number of client
connections that can be created on a server.
If a set of clients is attempting to create >800 connections to the same
server either during an operation or while prefilling its pool of
connections, a warning like this is logged on the server:

[warning 2017/02/06 13:12:34.846 PST server-1 <Handshaker
0.0.0.0/0.0.0.0:50780 Thread 0> tid=0x3c] Rejected connection from /xxxxx
because current connection count of 800 is greater than or equal to the
configured max of 800

And a warning like this is logged on the client:

[warning 2017/02/06 13:29:35.048 PST client-feeder <Thread-13> tid=0x1e]
Could not create a new connection to server:
xxxxx(server-1:8657)<v16>:21156 refused connection: exceeded
max-connections 800

And an exception like one of these is thrown on that client:

During an operation:

com.gemstone.gemfire.cache.client.NoAvailableServersException:
com.gemstone.gemfire.cache.client.ServerRefusedConnectionException:
xxxxx(server-1:8657)<v16>:21156 refused connection: exceeded
max-connections 800
  ...
at
com.gemstone.gemfire.internal.cache.LocalRegion.put(LocalRegion.java:1580)
at
com.gemstone.gemfire.internal.cache.AbstractRegion.put(AbstractRegion.java:327)
at TestClient$1.run(TestClient.java:74)
at java.lang.Thread.run(Thread.java:745)
Caused by:
com.gemstone.gemfire.cache.client.ServerRefusedConnectionException:
xxxxx(server-1:8657)<v16>:21156 refused connection: exceeded
max-connections 800
at
com.gemstone.gemfire.internal.cache.tier.sockets.HandShake.readMessage(HandShake.java:1466)
at
com.gemstone.gemfire.internal.cache.tier.sockets.HandShake.greet(HandShake.java:1317)
at
com.gemstone.gemfire.cache.client.internal.ConnectionImpl.connect(ConnectionImpl.java:112)
at
com.gemstone.gemfire.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:134)
at
com.gemstone.gemfire.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:252)
at
com.gemstone.gemfire.cache.client.internal.pooling.ConnectionManagerImpl.borrowConnection(ConnectionManagerImpl.java:214)

During prefill:

[info 2017/02/06 13:48:46.772 PST client-feeder <poolTimer-pool-3>
tid=0x16] Error prefilling connections :
com.gemstone.gemfire.cache.client.ServerRefusedConnectionException:
xxxxx(server-1:8796)<v19>:9152 refused connection: exceeded max-connections
800
com.gemstone.gemfire.cache.client.ServerRefusedConnectionException:
xxxxx(server-1:8796)<v19>:9152 refused connection: exceeded max-connections
16
at
com.gemstone.gemfire.internal.cache.tier.sockets.HandShake.readMessage(HandShake.java:1466)
at
com.gemstone.gemfire.internal.cache.tier.sockets.HandShake.greet(HandShake.java:1317)
at
com.gemstone.gemfire.cache.client.internal.ConnectionImpl.connect(ConnectionImpl.java:112)
at
com.gemstone.gemfire.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:134)
at
com.gemstone.gemfire.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:252)
at
com.gemstone.gemfire.cache.client.internal.pooling.ConnectionManagerImpl.prefillConnection(ConnectionManagerImpl.java:794)
at
com.gemstone.gemfire.cache.client.internal.pooling.ConnectionManagerImpl.prefill(ConnectionManagerImpl.java:737)
at
com.gemstone.gemfire.cache.client.internal.pooling.ConnectionManagerImpl$PrefillConnectionsTask.run2(ConnectionManagerImpl.java:888)

Either way, the server won't allow additional connections to it, and the
client operation will fail.

There are a few things you can do:

- increase max-connections to accomodate all the client connections
- handle the NoAvailableServersException by retrying. The hope is that the
retry will find an available connection rather than having to create a new
one
- limit the number of client connections with the max-connections pool
attribute. If max-connections is set and all client connections are in use,
a thread will wait for an available connection (for up to 10000 ms by
default controlled by the free-connection-timeout pool attribute) before
throwing an exception.

Also, just because there are 800 threads doing operations doesn't
necessarily mean there are 800 connections. Each client has a pool of
connections that its threads can use. In the extreme case, if there are 800
threads on a single client, its pretty unlikely that there will be 800
connections. Instead, its likely that a thread will find an available
existing connection rather than having to create a new one.


Thanks,
Barry Oglesby


On Mon, Feb 6, 2017 at 12:20 PM, Goutam Tadi <gt...@pivotal.io> wrote:

> Hi,
>
> I have a couple of questions regarding max-connections attribute in
> cache.xml.
>
> 1. If max-connections is set to 800 by default, does that mean if I have
> 800+ region.put() methods from multiple clients in parallel, Will this
> cause issue to some of the inserts or requests from server ?
>
> 2. If I would like to try multi threading (inserts/puts) by buffering rows
> to some size of 1MB and use putAll() to insert batch of rows into a region
> with max-connections set to 800 by default, will this cause issue to the
> client, if the client launches 800+ threads of batch inserts ?
>
>
> Thanks,
> Goutam Tadi.
> --
> Regards,
> *Goutam Tadi.*
>

Reply via email to