• guybe7's avatar
    Blocked module clients should be aware when a key is deleted (#11310) · b57fd010
    guybe7 authored
    The use case is a module that wants to implement a blocking command on a key that
    necessarily exists and wants to unblock the client in case the key is deleted (much like
    what we implemented for XREADGROUP in #10306)
    
    New module API:
    * RedisModule_BlockClientOnKeysWithFlags
    
    Flags:
    * REDISMODULE_BLOCK_UNBLOCK_NONE
    * REDISMODULE_BLOCK_UNBLOCK_DELETED
    
    ### Detailed description of code changes
    
    blocked.c:
    1. Both module and stream functions are called whether the key exists or not, regardless of
      its type. We do that in order to allow modules/stream to unblock the client in case the key
      is no longer present or has changed type (the behavior for streams didn't change, just code
      that moved into serveClientsBlockedOnStreamKey)
    2. Make sure afterCommand is called in serveClientsBlockedOnKeyByModule, in order to propagate
      actions from moduleTryServeClientBlockedOnKey.
    3. handleClientsBlockedOnKeys: call propagatePendingCommands directly after lookupKeyReadWithFlags
      to prevent a possible lazy-expire DEL from being mixed with any command propagated by the
      preceding functions.
    4. blockForKeys: Caller can specifiy that it wants to be awakened if key is deleted.
       Minor optimizations (use dictAddRaw).
    5. signalKeyAsReady became signalKeyAsReadyLogic which can take a boolean in case the key is deleted.
      It will only signal if there's at least one client that awaits key deletion (to save calls to
      handleClientsBlockedOnKeys).
      Minor optimizations (use dictAddRaw)
    
    db.c:
    1. scanDatabaseForDeletedStreams is now scanDatabaseForDeletedKeys and will signalKeyAsReady
      for any key that was removed from the database or changed type. It is the responsibility of the code
      in blocked.c to ignore or act on deleted/type-changed keys.
    2. Use the new signalDeletedKeyAsReady where needed
    
    blockedonkey.c + tcl:
    1. Added test of new capabilities (FSL.BPOPGT now requires the key to exist in order to work)
    b57fd010
t_zset.c 145 KB