Clean-up memcache connection sockets
The ConnectionPool currently opens sockets, but never closes them. As a result, any client using oslo.cache memcache pool leaves sockets in a CLOSE_WAIT state, with the source port not being re-usable. In our production system, were we have A LOT of activity, this creates a storm of non-reusable ports: all source ports are in use, making the node unuseable for other things. This patch adds a __del__ destructor closing inactive connections, fixing the issue. Closes-Bug: #2043121 Change-Id: I09d632346c76d1aff7c534f0d040162d1985f548
This commit is contained in:
parent
cb109b023a
commit
bae5561d4d
@ -93,6 +93,27 @@ class ConnectionPool(queue.Queue):
|
||||
self._connection_get_timeout = conn_get_timeout
|
||||
self._acquired = 0
|
||||
|
||||
def __del__(self):
|
||||
"""Delete the connection pool.
|
||||
|
||||
Destory all connections left in the queue.
|
||||
"""
|
||||
while True:
|
||||
# As per https://docs.python.org/3/library/collections.html
|
||||
# self.queue.pop() will raise IndexError when no elements are
|
||||
# present, ending the while True: loop.
|
||||
# The logic loops over all connections in the queue but it does
|
||||
# not retry for a single one in case a connection closure fails
|
||||
# then it leaves that one and process the next.
|
||||
try:
|
||||
conn = self.queue.pop().connection
|
||||
self._destroy_connection(conn)
|
||||
except IndexError:
|
||||
break
|
||||
except Exception as e:
|
||||
self._do_log(
|
||||
LOG.warning, "Unable to cleanup a connection: %s", e)
|
||||
|
||||
def _create_connection(self):
|
||||
"""Returns a connection instance.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user