From ae2d4217e147996bd6c546f559aa564f873f9203 Mon Sep 17 00:00:00 2001 From: kukey Date: Wed, 19 Jun 2024 08:48:58 +0800 Subject: [PATCH] Add new SCRIPT SHOW subcommand to dump script via sha1 (#617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In some scenarios, the business may not be able to find the previously used Lua script and only have a SHA signature. Or there are multiple identical evalsha's args in monitor/slowlog, and admin is not able to distinguish the script body. Add a new script subcommmand to show the contents of script given the scripts sha1. Returns a NOSCRIPT error if the script is not present in the cache. Usage: `SCRIPT SHOW sha1` Complexity: `O(1)` Closes #604. Doc PR: https://github.com/valkey-io/valkey-doc/pull/143 --------- Signed-off-by: wei.kukey Signed-off-by: Madelyn Olson Co-authored-by: Madelyn Olson Co-authored-by: Binbin Co-authored-by: Viktor Söderqvist --- src/commands.def | 23 +++++++++++++++++++++++ src/commands/script-show.json | 27 +++++++++++++++++++++++++++ src/eval.c | 12 ++++++++++++ src/server.c | 2 +- tests/unit/scripting.tcl | 15 +++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/commands/script-show.json diff --git a/src/commands.def b/src/commands.def index cb7fd73cc..989dd1864 100644 --- a/src/commands.def +++ b/src/commands.def @@ -5333,6 +5333,28 @@ struct COMMAND_ARG SCRIPT_LOAD_Args[] = { {MAKE_ARG("script",ARG_TYPE_STRING,-1,NULL,NULL,NULL,CMD_ARG_NONE,0,NULL)}, }; +/********** SCRIPT SHOW ********************/ + +#ifndef SKIP_CMD_HISTORY_TABLE +/* SCRIPT SHOW history */ +#define SCRIPT_SHOW_History NULL +#endif + +#ifndef SKIP_CMD_TIPS_TABLE +/* SCRIPT SHOW tips */ +#define SCRIPT_SHOW_Tips NULL +#endif + +#ifndef SKIP_CMD_KEY_SPECS_TABLE +/* SCRIPT SHOW key specs */ +#define SCRIPT_SHOW_Keyspecs NULL +#endif + +/* SCRIPT SHOW argument table */ +struct COMMAND_ARG SCRIPT_SHOW_Args[] = { +{MAKE_ARG("sha1",ARG_TYPE_STRING,-1,NULL,NULL,NULL,CMD_ARG_NONE,0,NULL)}, +}; + /* SCRIPT command table */ struct COMMAND_STRUCT SCRIPT_Subcommands[] = { {MAKE_CMD("debug","Sets the debug mode of server-side Lua scripts.","O(1)","3.2.0",CMD_DOC_NONE,NULL,NULL,"scripting",COMMAND_GROUP_SCRIPTING,SCRIPT_DEBUG_History,0,SCRIPT_DEBUG_Tips,0,scriptCommand,3,CMD_NOSCRIPT,ACL_CATEGORY_SCRIPTING,SCRIPT_DEBUG_Keyspecs,0,NULL,1),.args=SCRIPT_DEBUG_Args}, @@ -5341,6 +5363,7 @@ struct COMMAND_STRUCT SCRIPT_Subcommands[] = { {MAKE_CMD("help","Returns helpful text about the different subcommands.","O(1)","5.0.0",CMD_DOC_NONE,NULL,NULL,"scripting",COMMAND_GROUP_SCRIPTING,SCRIPT_HELP_History,0,SCRIPT_HELP_Tips,0,scriptCommand,2,CMD_LOADING|CMD_STALE,ACL_CATEGORY_SCRIPTING,SCRIPT_HELP_Keyspecs,0,NULL,0)}, {MAKE_CMD("kill","Terminates a server-side Lua script during execution.","O(1)","2.6.0",CMD_DOC_NONE,NULL,NULL,"scripting",COMMAND_GROUP_SCRIPTING,SCRIPT_KILL_History,0,SCRIPT_KILL_Tips,2,scriptCommand,2,CMD_NOSCRIPT|CMD_ALLOW_BUSY,ACL_CATEGORY_SCRIPTING,SCRIPT_KILL_Keyspecs,0,NULL,0)}, {MAKE_CMD("load","Loads a server-side Lua script to the script cache.","O(N) with N being the length in bytes of the script body.","2.6.0",CMD_DOC_NONE,NULL,NULL,"scripting",COMMAND_GROUP_SCRIPTING,SCRIPT_LOAD_History,0,SCRIPT_LOAD_Tips,2,scriptCommand,3,CMD_NOSCRIPT|CMD_STALE,ACL_CATEGORY_SCRIPTING,SCRIPT_LOAD_Keyspecs,0,NULL,1),.args=SCRIPT_LOAD_Args}, +{MAKE_CMD("show","Show server-side Lua script in the script cache.","O(1).","8.0.0",CMD_DOC_NONE,NULL,NULL,"scripting",COMMAND_GROUP_SCRIPTING,SCRIPT_SHOW_History,0,SCRIPT_SHOW_Tips,0,scriptCommand,3,CMD_NOSCRIPT,ACL_CATEGORY_SCRIPTING,SCRIPT_SHOW_Keyspecs,0,NULL,1),.args=SCRIPT_SHOW_Args}, {0} }; diff --git a/src/commands/script-show.json b/src/commands/script-show.json new file mode 100644 index 000000000..f22fa2967 --- /dev/null +++ b/src/commands/script-show.json @@ -0,0 +1,27 @@ +{ + "SHOW": { + "summary": "Show server-side Lua script in the script cache.", + "complexity": "O(1).", + "group": "scripting", + "since": "8.0.0", + "arity": 3, + "container": "SCRIPT", + "function": "scriptCommand", + "command_flags": [ + "NOSCRIPT" + ], + "acl_categories": [ + "SCRIPTING" + ], + "arguments": [ + { + "name": "sha1", + "type": "string" + } + ], + "reply_schema": { + "description": "Lua script if sha1 hash exists in script cache.", + "type": "string" + } + } +} diff --git a/src/eval.c b/src/eval.c index e747c233e..f4d09a5aa 100644 --- a/src/eval.c +++ b/src/eval.c @@ -682,6 +682,8 @@ void scriptCommand(client *c) { " Kill the currently executing Lua script.", "LOAD