diff options
author | Jordan Carlson <jwgcarlson@gmail.com> | 2021-06-01 20:39:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-01 20:39:14 -0700 |
commit | b164be9bf3c053b76d58f19eacfe7ff7cac1ca9b (patch) | |
tree | 99d68f3aadee86f4526cf5d54cc0405bb23beeee /pymemcache/test | |
parent | dd61d9f0878adba8692b49167f9a80af4de2f8c2 (diff) | |
download | pymemcache-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.py | 32 |
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) |