From fbc78212440baaf63ba10a652f388a1f90f09cd8 Mon Sep 17 00:00:00 2001 From: John Sully Date: Thu, 21 Nov 2019 20:40:58 -0500 Subject: [PATCH] Fix crash when client running async keys disconnects before keys finishes Former-commit-id: dd9233c49d82c89a9d92b7251a56f91c2ee98e77 --- src/blocked.cpp | 5 ++++- src/networking.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/blocked.cpp b/src/blocked.cpp index 13cc2347f..e62617a72 100644 --- a/src/blocked.cpp +++ b/src/blocked.cpp @@ -111,6 +111,8 @@ void blockClient(client *c, int btype) { serverAssert(GlobalLocksAcquired()); c->flags |= CLIENT_BLOCKED; c->btype = btype; + if (btype == BLOCKED_ASYNC) + c->casyncOpsPending++; g_pserver->blocked_clients++; g_pserver->blocked_clients_by_type[btype]++; } @@ -191,7 +193,8 @@ void unblockClient(client *c) { } else if (c->btype == BLOCKED_MODULE) { unblockClientFromModule(c); } else if (c->btype == BLOCKED_ASYNC) { - + serverAssert(c->casyncOpsPending > 0); + c->casyncOpsPending--; } else { serverPanic("Unknown btype in unblockClient()."); } diff --git a/src/networking.cpp b/src/networking.cpp index ad66b839d..8ce3387b8 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -1624,7 +1624,7 @@ void ProcessPendingAsyncWrites() std::atomic_thread_fence(std::memory_order_seq_cst); - if (c->casyncOpsPending == 0) + if (c->casyncOpsPending == 0 || c->btype == BLOCKED_ASYNC) // It's ok to send data if we're in a bgthread op { if (FCorrectThread(c)) {