mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
improve latency when a client is unblocked by module timer (#9593)
Scenario: 1. client block on command `XREAD BLOCK 0 STREAMS mystream $` 2. in a module, calling `XADD mystream * field value` via lua from a timer callback 3. client will receive response after some latency up to 100ms Reason: When `XADD` signal the key `mystream` as ready, `beforeSleep` in next eventloop will call `handleClientsBlockedOnKeys` to unblock the client and add pending data to write but not actually install a write handler, so next redis will block in `aeApiPoll` up to 100ms given `hz` config as default 10, pending data will be sent in another next eventloop by `handleClientsWithPendingWritesUsingThreads`. Calling `handleClientsBlockedOnKeys` before `handleClientsWithPendingWritesUsingThreads` in `beforeSleep` solves the problem.
This commit is contained in:
parent
897c7bddf5
commit
f5160ed0aa
10
src/server.c
10
src/server.c
@ -2941,17 +2941,17 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
|
|||||||
if (server.aof_state == AOF_ON)
|
if (server.aof_state == AOF_ON)
|
||||||
flushAppendOnlyFile(0);
|
flushAppendOnlyFile(0);
|
||||||
|
|
||||||
|
/* Try to process blocked clients every once in while. Example: A module
|
||||||
|
* calls RM_SignalKeyAsReady from within a timer callback (So we don't
|
||||||
|
* visit processCommand() at all). */
|
||||||
|
handleClientsBlockedOnKeys();
|
||||||
|
|
||||||
/* Handle writes with pending output buffers. */
|
/* Handle writes with pending output buffers. */
|
||||||
handleClientsWithPendingWritesUsingThreads();
|
handleClientsWithPendingWritesUsingThreads();
|
||||||
|
|
||||||
/* Close clients that need to be closed asynchronous */
|
/* Close clients that need to be closed asynchronous */
|
||||||
freeClientsInAsyncFreeQueue();
|
freeClientsInAsyncFreeQueue();
|
||||||
|
|
||||||
/* Try to process blocked clients every once in while. Example: A module
|
|
||||||
* calls RM_SignalKeyAsReady from within a timer callback (So we don't
|
|
||||||
* visit processCommand() at all). */
|
|
||||||
handleClientsBlockedOnKeys();
|
|
||||||
|
|
||||||
/* Disconnect some clients if they are consuming too much memory. */
|
/* Disconnect some clients if they are consuming too much memory. */
|
||||||
evictClients();
|
evictClients();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user