summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordvora-h <67596500+dvora-h@users.noreply.github.com>2022-06-01 16:46:21 +0300
committerGitHub <noreply@github.com>2022-06-01 16:46:21 +0300
commit3081a32b3852276999bb250655e4dfe2c87c654c (patch)
tree50a0417796dd6fc8531167b69dc0aa0ff179b495
parentfa0be7671de6be85f859cbb57a31531b2482c9e1 (diff)
downloadredis-py-3081a32b3852276999bb250655e4dfe2c87c654c.tar.gz
SHUTDOWN - add support for the new NOW, FORCE and ABORT modifiers (#2150)
* add support for NOW, FORCE and ABORT modifiers * linters * test * linters * test params * fix tests Co-authored-by: Chayim <chayim@users.noreply.github.com>
-rw-r--r--redis/commands/core.py43
-rw-r--r--tests/test_commands.py14
2 files changed, 51 insertions, 6 deletions
diff --git a/redis/commands/core.py b/redis/commands/core.py
index ab246a7..a337d4f 100644
--- a/redis/commands/core.py
+++ b/redis/commands/core.py
@@ -1153,12 +1153,25 @@ class ManagementCommands(CommandsProtocol):
"""
return self.execute_command("SAVE", **kwargs)
- def shutdown(self, save: bool = False, nosave: bool = False, **kwargs) -> None:
+ def shutdown(
+ self,
+ save: bool = False,
+ nosave: bool = False,
+ now: bool = False,
+ force: bool = False,
+ abort: bool = False,
+ **kwargs,
+ ) -> None:
"""Shutdown the Redis server. If Redis has persistence configured,
- data will be flushed before shutdown. If the "save" option is set,
- a data flush will be attempted even if there is no persistence
- configured. If the "nosave" option is set, no data flush will be
- attempted. The "save" and "nosave" options cannot both be set.
+ data will be flushed before shutdown.
+ It is possible to specify modifiers to alter the behavior of the command:
+ ``save`` will force a DB saving operation even if no save points are configured.
+ ``nosave`` will prevent a DB saving operation even if one or more save points
+ are configured.
+ ``now`` skips waiting for lagging replicas, i.e. it bypasses the first step in
+ the shutdown sequence.
+ ``force`` ignores any errors that would normally prevent the server from exiting
+ ``abort`` cancels an ongoing shutdown and cannot be combined with other flags.
For more information see https://redis.io/commands/shutdown
"""
@@ -1169,6 +1182,12 @@ class ManagementCommands(CommandsProtocol):
args.append("SAVE")
if nosave:
args.append("NOSAVE")
+ if now:
+ args.append("NOW")
+ if force:
+ args.append("FORCE")
+ if abort:
+ args.append("ABORT")
try:
self.execute_command(*args, **kwargs)
except ConnectionError:
@@ -1279,7 +1298,13 @@ class AsyncManagementCommands(ManagementCommands):
return super().memory_help(**kwargs)
async def shutdown(
- self, save: bool = False, nosave: bool = False, **kwargs
+ self,
+ save: bool = False,
+ nosave: bool = False,
+ now: bool = False,
+ force: bool = False,
+ abort: bool = False,
+ **kwargs,
) -> None:
"""Shutdown the Redis server. If Redis has persistence configured,
data will be flushed before shutdown. If the "save" option is set,
@@ -1296,6 +1321,12 @@ class AsyncManagementCommands(ManagementCommands):
args.append("SAVE")
if nosave:
args.append("NOSAVE")
+ if now:
+ args.append("NOW")
+ if force:
+ args.append("FORCE")
+ if abort:
+ args.append("ABORT")
try:
await self.execute_command(*args, **kwargs)
except ConnectionError:
diff --git a/tests/test_commands.py b/tests/test_commands.py
index 1ae6219..fcd2ed1 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -3,6 +3,7 @@ import datetime
import re
import time
from string import ascii_letters
+from unittest import mock
import pytest
@@ -4631,6 +4632,19 @@ class TestRedisCommands:
assert r.replicaof("NO ONE")
assert r.replicaof("NO", "ONE")
+ def test_shutdown(self, r: redis.Redis):
+ r.execute_command = mock.MagicMock()
+ r.execute_command("SHUTDOWN", "NOSAVE")
+ r.execute_command.assert_called_once_with("SHUTDOWN", "NOSAVE")
+
+ @skip_if_server_version_lt("7.0.0")
+ def test_shutdown_with_params(self, r: redis.Redis):
+ r.execute_command = mock.MagicMock()
+ r.execute_command("SHUTDOWN", "SAVE", "NOW", "FORCE")
+ r.execute_command.assert_called_once_with("SHUTDOWN", "SAVE", "NOW", "FORCE")
+ r.execute_command("SHUTDOWN", "ABORT")
+ r.execute_command.assert_called_with("SHUTDOWN", "ABORT")
+
@pytest.mark.replica
@skip_if_server_version_lt("2.8.0")
@skip_if_redis_enterprise()