• guybe7's avatar
    SCAN/RANDOMKEY and lazy-expire (#11788) · fd82bccd
    guybe7 authored
    Starting from Redis 7.0 (#9890) we started wrapping everything a command
     propagates with MULTI/EXEC. The problem is that both SCAN and RANDOMKEY can
    lazy-expire arbitrary keys (similar behavior to active-expire), and put DELs in a transaction.
    
    Fix: When these commands are called without a parent exec-unit (e.g. not in EVAL or
    MULTI) we avoid wrapping their DELs in a transaction (for the same reasons active-expire
    and eviction avoids a transaction)
    
    This PR adds a per-command flag that indicates that the command may touch arbitrary
    keys (not the ones in the arguments), and uses that flag to avoid the MULTI-EXEC.
    For now, this flag is internal, since we're considering other solutions for the future.
    
    Note for cluster mode: if SCAN/RANDOMKEY is inside EVAL/MULTI it can still cause the
    same situation (as it always did), but it won't cause a CROSSSLOT because replicas and AOF
    do not perform slot checks.
    The problem with the above is mainly for 3rd party ecosystem tools that propagate commands
    from master to master, or feed an AOF file with redis-cli into a master.
    This PR aims to fix the regression in redis 7.0, and we opened #11792 to try to handle the
    bigger problem with lazy expire better for another release.
    fd82bccd
server.c 281 KB