Handle empty memcache pool corner case

Change-Id: I8053d25a08fb630f38a22292c5f7c153c7cad4b3
Closes-Bug: #1523379
This commit is contained in:
Alexander Makarov 2016-06-03 15:03:02 +03:00
parent 3e8d5eb932
commit 79ebe621f8
1 changed files with 15 additions and 7 deletions

View File

@ -160,20 +160,28 @@ class ConnectionPool(queue.Queue):
qsize = _qsize
def _get(self):
if self.queue:
try:
conn = self.queue.pop().connection
else:
except IndexError:
conn = self._create_connection()
self._acquired += 1
return conn
def _drop_expired_connections(self):
"""Drop all expired connections from the right end of the queue."""
"""Drop all expired connections from the left end of the queue."""
now = time.time()
while self.queue and self.queue[0].ttl < now:
conn = self.queue.popleft().connection
self._trace_logger('Reaping connection %s', id(conn))
self._destroy_connection(conn)
try:
while self.queue[0].ttl < now:
conn = self.queue.popleft().connection
self._trace_logger('Reaping connection %s', id(conn))
self._destroy_connection(conn)
except IndexError:
# NOTE(amakarov): This is an expected excepton. so there's no
# need to react. We have to handle exceptions instead of
# checking queue length as IndexError is a result of race
# condition too as well as of mere queue depletio of mere queue
# depletionn.
pass
def _put(self, conn):
self.queue.append(_PoolItem(