Cleanup around script_caller, fix tracking of scripts and ACL logging for RM_Call (#11770)
* Make it clear that current_client is the root client that was called by external connection * add executing_client which is the client that runs the current command (can be a module or a script) * Remove script_caller that was used for commands that have CLIENT_SCRIPT to get the client that called the script. in most cases, that's the current_client, and in others (when being called from a module), it could be an intermediate client when we actually want the original one used by the external connection. bugfixes: * RM_Call with C flag should log ACL errors with the requested user rather than the one used by the original client, this also solves a crash when RM_Call is used with C flag from a detached thread safe context. * addACLLogEntry would have logged info about the script_caller, but in case the script was issued by a module command we actually want the current_client. the exception is when RM_Call is called from a timer event, in which case we don't have a current_client. behavior changes: * client side tracking for scripts now tracks the keys that are read by the script instead of the keys that are declared by the caller for EVAL other changes: * Log both current_client and executing_client in the crash log. * remove prepareLuaClient and resetLuaClient, being dead code that was forgotten. * remove scriptTimeSnapshot and snapshot_time and instead add cmd_time_snapshot that serves all commands and is reset only when execution nesting starts. * remove code to propagate CLIENT_FORCE_REPL from the executed command to the script caller since scripts aren't propagated anyway these days and anyway this flag wouldn't have had an effect since CLIENT_PREVENT_PROP is added by scriptResetRun. * fix a module GIL violation issue in afterSleep that was introduced in #10300 (unreleased)
This commit is contained in:
+5
-5
@@ -1846,14 +1846,13 @@ void logModulesInfo(void) {
|
||||
/* Log information about the "current" client, that is, the client that is
|
||||
* currently being served by Redis. May be NULL if Redis is not serving a
|
||||
* client right now. */
|
||||
void logCurrentClient(void) {
|
||||
if (server.current_client == NULL) return;
|
||||
void logCurrentClient(client *cc, const char *title) {
|
||||
if (cc == NULL) return;
|
||||
|
||||
client *cc = server.current_client;
|
||||
sds client;
|
||||
int j;
|
||||
|
||||
serverLogRaw(LL_WARNING|LL_RAW, "\n------ CURRENT CLIENT INFO ------\n");
|
||||
serverLog(LL_WARNING|LL_RAW, "\n------ %s CLIENT INFO ------\n", title);
|
||||
client = catClientInfoString(sdsempty(),cc);
|
||||
serverLog(LL_WARNING|LL_RAW,"%s\n", client);
|
||||
sdsfree(client);
|
||||
@@ -2112,7 +2111,8 @@ void printCrashReport(void) {
|
||||
logServerInfo();
|
||||
|
||||
/* Log the current client */
|
||||
logCurrentClient();
|
||||
logCurrentClient(server.current_client, "CURRENT");
|
||||
logCurrentClient(server.executing_client, "EXECUTING");
|
||||
|
||||
/* Log modules info. Something we wanna do last since we fear it may crash. */
|
||||
logModulesInfo();
|
||||
|
||||
Reference in New Issue
Block a user