• Oran Agra's avatar
    EXEC always fails with EXECABORT and multi-state is cleared · 65a3307b
    Oran Agra authored
    In order to support the use of multi-exec in pipeline, it is important that
    MULTI and EXEC are never rejected and it is easy for the client to know if the
    connection is still in multi state.
    
    It was easy to make sure MULTI and DISCARD never fail (done by previous
    commits) since these only change the client state and don't do any actual
    change in the server, but EXEC is a different story.
    
    Since in the past, it was possible for clients to handle some EXEC errors and
    retry the EXEC, we now can't affort to return any error on EXEC other than
    EXECABORT, which now carries with it the real reason for the abort too.
    
    Other fixes in this commit:
    - Some checks that where performed at the time of queuing need to be re-
      validated when EXEC runs, for instance if the transaction contains writes
      commands, it needs to be aborted. there was one check that was already done
      in execCommand (-READONLY), but other checks where missing: -OOM, -MISCONF,
      -NOREPLICAS, -MASTERDOWN
    - When a command is rejected by processCommand it was rejected with addReply,
      which was not recognized as an error in case the bad command came from the
      master. this will enable to count or MONITOR these errors in the future.
    - make it easier for tests to create additional (non deferred) clients.
    - add tests for the fixes of this commit.
    65a3307b
multi.tcl 12.4 KB