• A
    Fix modules blocking commands awake delay. · ffefc9f9
    antirez 提交于
    If a thread unblocks a client blocked in a module command, by using the
    RedisMdoule_UnblockClient() API, the event loop may not be awaken until
    the next timeout of the multiplexing API or the next unrelated I/O
    operation on other clients. We actually want the client to be served
    ASAP, so a mechanism is needed in order for the unblocking API to inform
    Redis that there is a client to serve ASAP.
    
    This commit fixes the issue using the old trick of the pipe: when a
    client needs to be unblocked, a byte is written in a pipe. When we run
    the list of clients blocked in modules, we consume all the bytes
    written in the pipe. Writes and reads are performed inside the context
    of the mutex, so no race is possible in which we consume the bytes that
    are actually related to an awake request for a client that should still
    be put into the list of clients to unblock.
    
    It was verified that after the fix the server handles the blocked
    clients with the expected short delay.
    
    Thanks to @dvirsky for understanding there was such a problem and
    reporting it.
    ffefc9f9
module.c 139.4 KB