From 352ea2365f251e1c26aa48d33c5d8c1a4abaa1c5 Mon Sep 17 00:00:00 2001 From: antirez Date: Sun, 15 Mar 2020 16:10:37 +0100 Subject: [PATCH] Aesthetic changes in PR #6989. --- src/networking.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/networking.c b/src/networking.c index 261c9b24a..c7dd2f23c 100644 --- a/src/networking.c +++ b/src/networking.c @@ -36,7 +36,7 @@ static void setProtocolError(const char *errstr, client *c); int postponeClientRead(client *c); -int process_while_blocked; +int ProcessingEventsWhileBlocked = 0; /* See processEventsWhileBlocked(). */ /* Return the size consumed from the allocator, for the specified SDS string, * including internal fragmentation. This function is used in order to compute @@ -2739,7 +2739,12 @@ int clientsArePaused(void) { int processEventsWhileBlocked(void) { int iterations = 4; /* See the function top-comment. */ int count = 0; - process_while_blocked = 1; + + /* Note: when we are processing events while blocked (for instance during + * busy Lua scripts), we set a global flag. When such flag is set, we + * avoid handling the read part of clients using threaded I/O. + * See https://github.com/antirez/redis/issues/6988 for more info. */ + ProcessingEventsWhileBlocked = 1; while (iterations--) { int events = 0; events += aeProcessEvents(server.el, AE_FILE_EVENTS|AE_DONT_WAIT); @@ -2747,7 +2752,7 @@ int processEventsWhileBlocked(void) { if (!events) break; count += events; } - process_while_blocked = 0; + ProcessingEventsWhileBlocked = 0; return count; } @@ -2819,7 +2824,6 @@ void *IOThreadMain(void *myid) { /* Initialize the data structures needed for threaded I/O. */ void initThreadedIO(void) { io_threads_active = 0; /* We start with threads not active. */ - process_while_blocked = 0; /* Don't spawn any thread if the user selected a single thread: * we'll handle I/O directly from the main thread. */ @@ -2974,7 +2978,7 @@ int handleClientsWithPendingWritesUsingThreads(void) { int postponeClientRead(client *c) { if (io_threads_active && server.io_threads_do_reads && - !process_while_blocked && + !ProcessingEventsWhileBlocked && !(c->flags & (CLIENT_MASTER|CLIENT_SLAVE|CLIENT_PENDING_READ))) { c->flags |= CLIENT_PENDING_READ;