• Oran Agra's avatar
    Fix SLOWLOG for blocked commands (#8632) · 497351ad
    Oran Agra authored
    * SLOWLOG didn't record anything for blocked commands because the client
      was reset and argv was already empty. there was a fix for this issue
      specifically for modules, now it works for all blocked clients.
    * The original command argv (before being re-written) was also reset
      before adding the slowlog on behalf of the blocked command.
    * Latency monitor is now updated regardless of the slowlog flags of the
      command or its execution (their purpose is to hide sensitive info from
      the slowlog, not hide the fact the latency happened).
    * Latency monitor now uses real_cmd rather than c->cmd (which may be
      different if the command got re-written, e.g. GEOADD)
    
    Changes:
    * Unify shared code between slowlog insertion in call() and
      updateStatsOnUnblock(), hopefully prevent future bugs from happening
      due to the later being overlooked.
    * Reset CLIENT_PREVENT_LOGGING in resetClient rather than after command
      processing.
    * Add a test for SLOWLOG and BLPOP
    
    Notes:
    - real_cmd == c->lastcmd, except inside MULTI and Lua.
    - blocked commands never happen in these cases (MULTI / Lua)
    - real_cmd == c->cmd, except for when the command is rewritten (e.g.
      GEOADD)
    - blocked commands (currently) are never rewritten
    - other than the command's CLIENT_PREVENT_LOGGING, and the
      execution flag CLIENT_PREVENT_LOGGING, other cases that we want to
      avoid slowlog are on AOF loading (specifically CMD_CALL_SLOWLOG will
      be off when executed from execCommand that runs from an AOF)
    497351ad
module.c 369 KB