Devs,

The current connection pooling implementation contains a setting that enables a 
secondary pool that is thread local. See ClientCacheFactory. 
setPoolThreadLocalConnections method for details. This thread local pooling was 
added to reduce contention on the primary connection pool under high thread 
count or load. As of the completion of GEODE-6515 there is no longer a 
contention issue in the primary pool under high thread count or load, 
effectively rendering thread local pooling a no-op. Thread local pooling also 
introduces many complexities into the primary pool management of connections 
since a connection can either be in the primary pool or a pool for each thread. 
Connection idle timeout, lifetime expiration and load conditioning all have to 
work around thread local connections making for some interesting relationships 
and behavior. Additionally clients of thread local connections needed to call 
Pool.releaseThreadLocalConnections prior to the thread terminating or 
connections would be held until the GC finalized the thread local storage. Use 
of thread local connections typically mean significantly high connection counts 
on the servers since each thread could horde connections to each server 
regardless of current workload need.

I propose that we deprecate all the public APIs for thread local connections 
and immediately remove the behavior. The API methods will go from an effective 
no-op to an actual no-op. A warning will be logged when ClientCacheFactory. 
setPoolThreadLocalConnections is used. Internally all thread local connection 
implementation will be removed. The net effect to the client will be the same 
as promised with thread local connections, that content on the primary pool is 
reduced for high thread count and load. Additionally, the connection count to 
each server will be reduced since threads won’t be holding connections to 
servers they are not actively communicating with. All in all this will be a 
net-positive improvement for the consuming client and the distributed system as 
a whole. Internally this will be huge win as it removes complexity and opens a 
path to removing even more complexity in idle connection timeouts, connection 
lifetime expiration, and load conditioning. Please see GEODE-6594 for more 
details.

I realize this is sort of a grey area. An obvious questions is, “doesn’t this 
violate semver by removing a feature in a minor?” My answer is a solid, “nope!” 
The feature is defined as “reducing contention on the connection pool”, which 
is provided now by default in the refactored connection pool. All that is being 
done is deprecating and warning that a useless API is being removed in the next 
major release. The feature remains intact and client code does not need to be 
re-compiled or changed. 

I would love to hear if anyone has any concerns, questions or dissenting 
opinions about this proposal. PR 3394 has been opened for review of the code 
changes related to the removal. Please provide feedback in the PR relating only 
to the code and discussions about the merits of he proposal here in this email 
thread.

Thanks,
Jake

GEODE-6515 - https://issues.apache.org/jira/browse/GEODE-6515 
<https://issues.apache.org/jira/browse/GEODE-6515>
GEODE-6594 - https://issues.apache.org/jira/browse/GEODE-6594 
<https://issues.apache.org/jira/browse/GEODE-6594>
PR 3394 - https://github.com/apache/geode/pull/3394 
<https://github.com/apache/geode/pull/3394>

Reply via email to