summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2019-09-25 18:07:25 +0200
committerGitHub <noreply@github.com>2019-09-25 18:07:25 +0200
commitf3aaf2b4d858a83796392bf2d4206855971b6a19 (patch)
treebcee0736e5fec497ce34d86f8055e8859a2c7484
parentf6cf08e5828c5af18352d55925d9b2de16a332a8 (diff)
parent7a73b7f168eb01c4cf43ab0e0348f0f2d9922cb5 (diff)
downloadredis-f3aaf2b4d858a83796392bf2d4206855971b6a19.tar.gz
Merge pull request #6401 from valentinogeron/fix-discard-during-oom
DISCARD should not fail during OOM
-rw-r--r--src/server.c2
-rw-r--r--tests/unit/multi.tcl14
2 files changed, 15 insertions, 1 deletions
diff --git a/src/server.c b/src/server.c
index fc995f35c..42dc8f1e4 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3412,7 +3412,7 @@ int processCommand(client *c) {
* is in MULTI/EXEC context? Error. */
if (out_of_memory &&
(c->cmd->flags & CMD_DENYOOM ||
- (c->flags & CLIENT_MULTI && c->cmd->proc != execCommand))) {
+ (c->flags & CLIENT_MULTI && c->cmd->proc != execCommand && c->cmd->proc != discardCommand))) {
flagTransaction(c);
addReply(c, shared.oomerr);
return C_OK;
diff --git a/tests/unit/multi.tcl b/tests/unit/multi.tcl
index 6655bf62c..9fcef71d6 100644
--- a/tests/unit/multi.tcl
+++ b/tests/unit/multi.tcl
@@ -306,4 +306,18 @@ start_server {tags {"multi"}} {
}
close_replication_stream $repl
}
+
+ test {DISCARD should not fail during OOM} {
+ set rd [redis_deferring_client]
+ $rd config set maxmemory 1
+ assert {[$rd read] eq {OK}}
+ r multi
+ catch {r set x 1} e
+ assert_match {OOM*} $e
+ r discard
+ $rd config set maxmemory 0
+ assert {[$rd read] eq {OK}}
+ $rd close
+ r ping
+ } {PONG}
}