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)
|
||||
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. */
|
||||
handleClientsWithPendingWritesUsingThreads();
|
||||
|
||||
/* Close clients that need to be closed asynchronous */
|
||||
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. */
|
||||
evictClients();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user