Skip to content

Commit

Permalink
Use the correct command proc for the LOOKUP_NOTOUCH exception in look…
Browse files Browse the repository at this point in the history
…upKey (#1499)

When looking up a key in no-touch mode, `LOOKUP_NOTOUCH` is set to avoid
updating the last access time in `lookupKey`. An exception must be made
for the `TOUCH` command which must always update the key.

When called from a script, `server.executing_client` will point to the
`TOUCH` command, while `server.current_client` will point to e.g. an
`EVAL` command. So, we must use the former to find out the currently
executing command if defined.

This fix addresses the issue where TOUCH wasn't updating key access
times when called from scripts like EVAL.

Fixes #1498

Signed-off-by: Simon Baatz <[email protected]>
Co-authored-by: Binbin <[email protected]>
  • Loading branch information
gmbnomis and enjoy-binbin authored Jan 3, 2025
1 parent 93b701d commit 26a72fa
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/db.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ robj *lookupKey(serverDb *db, robj *key, int flags) {
* Don't do it if we have a saving child, as this will trigger
* a copy on write madness. */
if (server.current_client && server.current_client->flag.no_touch &&
server.current_client->cmd->proc != touchCommand)
server.executing_client->cmd->proc != touchCommand)
flags |= LOOKUP_NOTOUCH;
if (!hasActiveChildProcess() && !(flags & LOOKUP_NOTOUCH)) {
/* Shared objects can't be stored in the database. */
Expand Down
15 changes: 14 additions & 1 deletion tests/unit/introspection-2.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,24 @@ start_server {tags {"introspection"}} {
assert {[r object idletime foo] >= 2}
}

test {TOUCH alters the last access time of a key} {
proc test_touch_alters_access_time {} {
r set foo bar
r set script_foo bar
after 3000
r touch foo
r eval {redis.call('touch', KEYS[1])} 1 script_foo
assert {[r object idletime foo] < 2}
assert {[r object idletime script_foo] < 2}
}

test {TOUCH alters the last access time of a key} {
test_touch_alters_access_time
}

test {TOUCH alters the last access time of a key in no-touch mode} {
r client no-touch on
test_touch_alters_access_time
r client no-touch off
}

test {Operations in no-touch mode do not alter the last access time of a key} {
Expand Down

0 comments on commit 26a72fa

Please sign in to comment.