summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChayim <chayim@users.noreply.github.com>2021-07-25 09:07:30 +0300
committerGitHub <noreply@github.com>2021-07-25 09:07:30 +0300
commitb021f5a15e61ac4217b533443eba0a1c56c03ef3 (patch)
tree8b2ec983322d52e3dcd654c1b82fe2f0472a0869
parent88e5bd8938006a6e7bcc626048a9cd4572bbac68 (diff)
downloadredis-py-b021f5a15e61ac4217b533443eba0a1c56c03ef3.tar.gz
Implements CLIENT KILL laddr filter (#1506)
-rwxr-xr-xredis/client.py6
-rw-r--r--tests/test_commands.py20
2 files changed, 25 insertions, 1 deletions
diff --git a/redis/client.py b/redis/client.py
index db4778c..ef3c82c 100755
--- a/redis/client.py
+++ b/redis/client.py
@@ -1210,7 +1210,8 @@ class Redis:
"Disconnects the client at ``address`` (ip:port)"
return self.execute_command('CLIENT KILL', address)
- def client_kill_filter(self, _id=None, _type=None, addr=None, skipme=None):
+ def client_kill_filter(self, _id=None, _type=None, addr=None,
+ skipme=None, laddr=None):
"""
Disconnects client(s) using a variety of filter options
:param id: Kills a client by its unique ID field
@@ -1218,6 +1219,7 @@ class Redis:
'master', 'slave' or 'pubsub'
:param addr: Kills a client by its 'address:port'
:param skipme: If True, then the client calling the command
+ :param laddr: Kills a cient by its 'local (bind) address:port'
will not get killed even if it is identified by one of the filter
options. If skipme is not provided, the server defaults to skipme=True
"""
@@ -1239,6 +1241,8 @@ class Redis:
args.extend((b'ID', _id))
if addr is not None:
args.extend((b'ADDR', addr))
+ if laddr is not None:
+ args.extend((b'LADDR', laddr))
if not args:
raise DataError("CLIENT KILL <filter> <value> ... ... <filter> "
"<value> must specify at least one filter")
diff --git a/tests/test_commands.py b/tests/test_commands.py
index 362e7ab..18f37d1 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -395,6 +395,26 @@ class TestRedisCommands:
# we don't know which client ours will be
assert 'redis_py_test' in [c['name'] for c in clients]
+ @skip_if_server_version_lt('6.2.0')
+ def test_client_kill_filter_by_laddr(self, r, r2):
+ r.client_setname('redis-py-c1')
+ r2.client_setname('redis-py-c2')
+ clients = [client for client in r.client_list()
+ if client.get('name') in ['redis-py-c1', 'redis-py-c2']]
+ assert len(clients) == 2
+
+ clients_by_name = dict([(client.get('name'), client)
+ for client in clients])
+
+ client_2_addr = clients_by_name['redis-py-c2'].get('laddr')
+ resp = r.client_kill_filter(laddr=client_2_addr)
+ assert resp == 1
+
+ clients = [client for client in r.client_list()
+ if client.get('name') in ['redis-py-c1', 'redis-py-c2']]
+ assert len(clients) == 1
+ assert clients[0].get('name') == 'redis-py-c1'
+
@skip_if_server_version_lt('2.9.50')
def test_client_pause(self, r):
assert r.client_pause(1)