• guybe7's avatar
    Sort out mess around propagation and MULTI/EXEC (#9890) · 7ac21307
    guybe7 authored
    The mess:
    Some parts use alsoPropagate for late propagation, others using an immediate one (propagate()),
    causing edge cases, ugly/hacky code, and the tendency for bugs
    
    The basic idea is that all commands are propagated via alsoPropagate (i.e. added to a list) and the
    top-most call() is responsible for going over that list and actually propagating them (and wrapping
    them in MULTI/EXEC if there's more than one command). This is done in the new function,
    propagatePendingCommands.
    
    Callers to propagatePendingCommands:
    1. top-most call() (we want all nested call()s to add to the also_propagate array and just the top-most
       one to propagate them) - via `afterCommand`
    2. handleClientsBlockedOnKeys: it is out of call() context and it may propagate stuff - via `afterCommand`. 
    3. handleClientsBlockedOnKeys edge case: if the looked-up key is already expired, we will propagate the
       expire but will not unblock any client so `afterCommand` isn'...
    7ac21307
expire.c 29.4 KB