[ https://issues.apache.org/jira/browse/GEODE-6594?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jacob S. Barrett reassigned GEODE-6594: --------------------------------------- Assignee: Jacob S. Barrett > Simplify client connection pooling > ---------------------------------- > > Key: GEODE-6594 > URL: https://issues.apache.org/jira/browse/GEODE-6594 > Project: Geode > Issue Type: Improvement > Components: client/server > Reporter: Jacob S. Barrett > Assignee: Jacob S. Barrett > Priority: Major > > Current client connection pooling is multi-layered. A {{Connection}} is > wrapped in a pooled {PooledConnection}}. A {{PooledConnection}} is kept in > primary pool in an {allConnections}} set and when unused it is also in the > {{availableConnections}} deque. A {{PooledConnection}} can also be held in a > thread local pool (secondary pool). If in a thread local pool then it is not > in the primary pool's {{availableConnections}}. This arrangement between the > secondary and primary pools results in complex relationships with expirations > and rebalancing actions. Since GEODE-6515 thread local connections does not > provide a performance boost over the primary pool anymore we should remove it > entirely, thus simplifying these complexities. > Idle connection timeouts must scan the {{allConnections}} set since the > secondary may hold idle connections that won't be in the > {{availableConnections}}. This requires scanning the entire set of > connections with an exclusive lock, which can be really expensive for large > connection pools. If there were no secondary pools we could scan the > {{availableConnections}} deque in reverse order stopping at the first idle > connection not exceeding the timeout limit. This scan would be lock free and > would not touch every connection. The {{availableConnections}} deque is used > as a LIFO queue so connections at the front are hot and connection at the end > are cold. > Connection lifetime expiration currently requires, again scanning the > {{allConnections}} set with exclusive lock looking for connections that are > over the lifetime limit. If the connection needs to be expired then the > {{PooledConnection}} as its {{Connection}} swapped out for a new one to the > same server. If we remove the secondary pool then expired connections could > simply be removed from the {{availableConnections}} and {{allConnections}} > and destroyed. A new connection would be created either on demand of from > pre-fill. No complicated logic is required to support swapping out the > underlying {{Connection}}. > Currently load conditioning requires scanning the {{allConnections}} for N > number of idle connections to specific servers. Each matching > {{PooledConnection}} then has it's underlying {{Connection}} swapped out for > one to a different server. This requires extra logic in the > {{borrowConnection(forServer)}} method to check that the associated server > hasn't changed between to matching and activation, if it has it must be > placed back in the queue and the scan must be repeated. Removing the > secondary pool will removed the need to swap out connections. Any matching > idle connection from the {{availableConnections}} queue will just be > destroyed. New connections will be created to the less loaded server either > on demand or via pre-fill. No complicated logic for swapping connections is > required and no recheck for chaining servers is required. -- This message was sent by Atlassian JIRA (v7.6.3#76005)