summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/networking.c14
-rw-r--r--src/server.c4
2 files changed, 12 insertions, 6 deletions
diff --git a/src/networking.c b/src/networking.c
index b6ae9bd50..0690bbdf6 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;
diff --git a/src/server.c b/src/server.c
index a6d4b357e..f702da94a 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2088,6 +2088,9 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
void beforeSleep(struct aeEventLoop *eventLoop) {
UNUSED(eventLoop);
+ /* We should handle pending reads clients ASAP after event loop. */
+ handleClientsWithPendingReadsUsingThreads();
+
/* Handle TLS pending data. (must be done before flushAppendOnlyFile) */
tlsProcessPendingData();
/* If tls still has pending unread data don't sleep at all. */
@@ -2157,7 +2160,6 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
void afterSleep(struct aeEventLoop *eventLoop) {
UNUSED(eventLoop);
if (moduleCount()) moduleAcquireGIL();
- handleClientsWithPendingReadsUsingThreads();
}
/* =========================== Server initialization ======================== */