From 9ab91b8c6c599aedad1c5f0521e2036dcf1d0566 Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 30 Aug 2018 17:40:58 +0200 Subject: [PATCH] While the slave is busy, just accumulate master input. Processing command from the master while the slave is in busy state is not correct, however we cannot, also, just reply -BUSY to the replication stream commands from the master. The correct solution is to stop processing data from the master, but just accumulate the stream into the buffers and resume the processing later. Related to #5297. --- src/networking.c | 6 ++++++ src/server.c | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/networking.c b/src/networking.c index 58248ced..eb581462 100644 --- a/src/networking.c +++ b/src/networking.c @@ -1362,6 +1362,12 @@ void processInputBuffer(client *c) { /* Immediately abort if the client is in the middle of something. */ if (c->flags & CLIENT_BLOCKED) break; + /* Don't process input from the master while there is a busy script + * condition on the slave. We want just to accumulate the replication + * stream (instead of replying -BUSY like we do with other clients) and + * later resume the processing. */ + if (server.lua_timedout && c->flags & CLIENT_MASTER) break; + /* CLIENT_CLOSE_AFTER_REPLY closes the connection once the reply is * written to the client. Make sure to not let the reply grow after * this flag has been set (i.e. don't process more commands). diff --git a/src/server.c b/src/server.c index 1afc9a80..55bcb4dc 100644 --- a/src/server.c +++ b/src/server.c @@ -2683,7 +2683,6 @@ int processCommand(client *c) { /* Lua script too slow? Only allow a limited number of commands. */ if (server.lua_timedout && - !(c->flags & CLIENT_MASTER) && c->cmd->proc != authCommand && c->cmd->proc != replconfCommand && !(c->cmd->proc == shutdownCommand &&