• yoav-steinberg's avatar
    Consistent erros returned from EVAL scripts (#10218) · b76016a9
    yoav-steinberg authored
    This PR handles inconsistencies in errors returned from lua scripts.
    Details of the problem can be found in #10165.
    
    ### Changes
    
    - Remove double stack trace. It's enough that a stack trace is automatically added by the engine's error handler
      see https://github.com/redis/redis/blob/d0bc4fff18afdf9e5421cc88e23ffbb876ecaec3/src/function_lua.c#L472-L485
      and https://github.com/redis/redis/blob/d0bc4fff18afdf9e5421cc88e23ffbb876ecaec3/src/eval.c#L243-L255
    - Make sure all errors a preceded with an error code. Passing a simple string to `luaPushError()` will prepend it
      with a generic `ERR` error code.
    - Make sure lua error table doesn't include a RESP `-` error status. Lua stores redis error's as a lua table with a
      single `err` field and a string. When the string is translated back to RESP we add a `-` to it.
      See https://github.com/redis/redis/blob/d0bc4fff18afdf9e5421cc88e23ffbb876ecaec3/src/script_lua.c#L510-L517
      So there's no need to store it in the lua table.
    
    ### Before & After
    ```diff
    --- <unnamed>
    +++ <unnamed>
    @@ -1,14 +1,14 @@
      1: config set maxmemory 1
      2: +OK
      3: eval "return redis.call('set','x','y')" 0
    - 4: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: @user_script: 1: -OOM command not allowed when used memory > 'maxmemory'.
    + 4: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: OOM command not allowed when used memory > 'maxmemory'.
      5: eval "return redis.pcall('set','x','y')" 0
    - 6: -@user_script: 1: -OOM command not allowed when used memory > 'maxmemory'.
    + 6: -OOM command not allowed when used memory > 'maxmemory'.
      7: eval "return redis.call('select',99)" 0
      8: -ERR Error running script (call to 4ad5abfc50bbccb484223905f9a16f09cd043ba8): @user_script:1: ERR DB index is out of range
      9: eval "return redis.pcall('select',99)" 0
     10: -ERR DB index is out of range
     11: eval_ro "return redis.call('set','x','y')" 0
    -12: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: @user_script: 1: Write commands are not allowed from read-only scripts.
    +12: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: ERR Write commands are not allowed from read-only scripts.
     13: eval_ro "return redis.pcall('set','x','y')" 0
    -14: -@user_script: 1: Write commands are not allowed from read-only scripts.
    +14: -ERR Write commands are not allowed from read-only scripts.
    ```
    b76016a9
scripting.tcl 51.1 KB