summaryrefslogtreecommitdiff
path: root/pymemcache/test
diff options
context:
space:
mode:
authorJordan Carlson <jwgcarlson@gmail.com>2021-06-01 20:39:14 -0700
committerGitHub <noreply@github.com>2021-06-01 20:39:14 -0700
commitb164be9bf3c053b76d58f19eacfe7ff7cac1ca9b (patch)
tree99d68f3aadee86f4526cf5d54cc0405bb23beeee /pymemcache/test
parentdd61d9f0878adba8692b49167f9a80af4de2f8c2 (diff)
downloadpymemcache-b164be9bf3c053b76d58f19eacfe7ff7cac1ca9b.tar.gz
Remove idle connections from pool (#309)
The Memcached server can be configured to drop idle connections (via the idle_timeout option). When this occurs, pymemcache may still try to use the connection, resulting in MemcacheUnexpectedCloseError. Hence the need for client-side idle timeout logic.
Diffstat (limited to 'pymemcache/test')
-rw-r--r--pymemcache/test/test_client.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py
index bdaf233..24ecab2 100644
--- a/pymemcache/test/test_client.py
+++ b/pymemcache/test/test_client.py
@@ -1255,6 +1255,38 @@ class TestPooledClient(ClientTestMixin, unittest.TestCase):
assert isinstance(client.client_pool.get(), MyClient)
+class TestPooledClientIdleTimeout(ClientTestMixin, unittest.TestCase):
+ def make_client(self, mock_socket_values, **kwargs):
+ mock_client = Client(None, **kwargs)
+ mock_client.sock = MockSocket(list(mock_socket_values))
+ client = PooledClient(None, pool_idle_timeout=60, **kwargs)
+ client.client_pool = pool.ObjectPool(lambda: mock_client)
+ return client
+
+ def test_free_idle(self):
+ class Counter(object):
+ count = 0
+
+ def increment(self, obj):
+ self.count += 1
+
+ removed = Counter()
+
+ client = self.make_client([b'VALUE key 0 5\r\nvalue\r\nEND\r\n']*2)
+ client.client_pool._after_remove = removed.increment
+ client.client_pool._idle_clock = lambda: 0
+
+ client.set(b'key', b'value')
+ assert removed.count == 0
+ client.get(b'key')
+ assert removed.count == 0
+
+ # Advance clock to beyond the idle timeout.
+ client.client_pool._idle_clock = lambda: 61
+ client.get(b'key')
+ assert removed.count == 1
+
+
class TestMockClient(ClientTestMixin, unittest.TestCase):
def make_client(self, mock_socket_values, **kwargs):
client = MockMemcacheClient(None, **kwargs)