Alberto Gomez created GEODE-8613:
------------------------------------

             Summary: Remove exclusive access to pool connection 
creation/removal in native client
                 Key: GEODE-8613
                 URL: https://issues.apache.org/jira/browse/GEODE-8613
             Project: Geode
          Issue Type: Improvement
          Components: native client
            Reporter: Alberto Gomez


The Apache Geode C++ native client uses a mutex to grant exclusive access to 
the code that creates or removes pool connections (mutex_ member in 
ThinClientPoolDM class). The reason behind seems to be to perform atomically 
the creation of the connection and the update of the number of connections 
(m_poolSize) of the pool so that the number of connections in the pool and the 
counter are always aligned.

This mutex is also used to protect the concurrent access to the connection 
queue structure (ConnectionQueue class).

So, the mutex is used for two different purposes.

Getting this mutex while creating/removing a pool connection has an impact in 
the performance of the client because connections cannot be created 
concurrently but there are also negative side effects that could lead to a 
freeze of the client if the connection creation is taking a long time (for 
example when the DNS is not available and name resolution calls take seconds to 
be answered).

A particularly problematic case is that when a minimum number of connections 
has been configured in the client, loadconditioning or connection expiration is 
configured and the DNS becomes unavailable. If at a given point in time the 
number of connections in the pool is lower than the minimum configured, the 
thread that restores the minimum number of connections will try to create a new 
connection and will not release the mutex until it has finished. This will 
block other threads trying to get a connection from the queue unnecessarily.

In this ticket, it is proposed to remove the locking of the mutex when the 
connection is created or removed. An alternative could be to create a new mutex 
for the creation or removal of connections so that the access to the 
ConnectionQueue is not affected by the creation/removal of connections but I do 
not consider it necessary just to maintain consistent (and not only eventually 
consistent) the number of connection of the pool and the counter of the 
connections (m_poolSize).

Note that this ticket does not propose to remove the use of the mutex to access 
the ConnectionQueue. This will still be necessary to protect concurrent access 
to the connection queue data structure.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to