• guybe7's avatar
    Modules: Unblock from within a timer coverage (#12337) · 32301999
    guybe7 authored
    Apart from adding the missing coverage, this PR also adds `blockedBeforeSleep`
    that gathers all block-related functions from `beforeSleep`
    
    The order inside `blockedBeforeSleep` is different: now `handleClientsBlockedOnKeys`
    (which may unblock clients) is called before `processUnblockedClients` (which handles
    unblocked clients).
    It makes sense to have this order.
    
    There are no visible effects of the wrong ordering, except some cleanups of the now-unblocked
    client would have  happen in the next `beforeSleep` (will now happen in the current one)
    
    The reason we even got into it is because i triggers an assertion in logresreq.c (breaking
    the assumption that `unblockClient` is called **before** actually flushing the reply to the socket):
    `handleClientsBlockedOnKeys` is called, then it calls `moduleUnblockClientOnKey`, which calls
    `moduleUnblockClient`, which adds the client to `moduleUnblockedClients` back to `beforeSleep`,
    we call `handleClientsWithPendingWritesUsingThreads`, it writes the data of buf to the client, so
    `client->bufpos` became 0
    On the next `beforeSleep`, we call `moduleHandleBlockedClients`, which calls `unblockClient`,
    which calls `reqresAppendResponse`, triggering the assert. (because the `bufpos` is 0) - see https://github.com/redis/redis/pull/12301#discussion_r1226386716
    32301999
blockonkeys.c 23.6 KB