• antirez's avatar
    Replication: disconnect blocked clients when switching to slave role. · 7e78ab4b
    antirez authored
    Bug as old as Redis and blocking operations. It's hard to trigger since
    only happens on instance role switch, but the results are quite bad
    since an inconsistency between master and slave is created.
    
    How to trigger the bug is a good description of the bug itself.
    
    1. Client does "BLPOP mylist 0" in master.
    2. Master is turned into slave, that replicates from New-Master.
    3. Client does "LPUSH mylist foo" in New-Master.
    4. New-Master propagates write to slave.
    5. Slave receives the LPUSH, the blocked client get served.
    
    Now Master "mylist" key has "foo", Slave "mylist" key is empty.
    
    Highlights:
    
    * At step "2" above, the client remains attached, basically escaping any
      check performed during command dispatch: read only slave, in that case.
    * At step "5" the slave (that was the master), serves the blocked client
      consuming a list element, which is not consumed on the master side.
    
    This scenario is technically likely to happen during failovers, however
    since Redis Sentinel already disconnects clients using the CLIENT
    command when changing the role of the instance, the bug is avoided in
    Sentinel deployments.
    
    Closes #2473.
    7e78ab4b
redis.h 68.1 KB