summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2019-07-03 12:42:16 +0200
committerantirez <antirez@gmail.com>2019-07-03 12:42:16 +0200
commit506764b3f87789bfe219da0b07b79f01917bff9f (patch)
tree4498cd6b311249e569aef0e9a48c645cec7068f6
parentdb16a861a1ca2f43f340c68c00a47b69a15a6f03 (diff)
downloadredis-506764b3f87789bfe219da0b07b79f01917bff9f.tar.gz
Client side caching: hook inside call() for tracking.
-rw-r--r--src/server.c11
-rw-r--r--src/server.h1
2 files changed, 12 insertions, 0 deletions
diff --git a/src/server.c b/src/server.c
index 4b87b6ac2..bb891594b 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3194,6 +3194,7 @@ void call(client *c, int flags) {
latencyAddSampleIfNeeded(latency_event,duration/1000);
slowlogPushEntryIfNeeded(c,c->argv,c->argc,duration);
}
+
if (flags & CMD_CALL_STATS) {
/* use the real command that was executed (cmd and lastamc) may be
* different, in case of MULTI-EXEC or re-written commands such as
@@ -3261,6 +3262,16 @@ void call(client *c, int flags) {
redisOpArrayFree(&server.also_propagate);
}
server.also_propagate = prev_also_propagate;
+
+ /* If the client has keys tracking enabled for client side caching,
+ * make sure to remember the keys it fetched via this command. */
+ if (c->cmd->flags & CMD_READONLY) {
+ client *caller = (c->flags & CLIENT_LUA && server.lua_caller) ?
+ server.lua_caller : c;
+ if (caller->flags & CLIENT_TRACKING)
+ trackingRememberKeys(caller);
+ }
+
server.stat_numcommands++;
}
diff --git a/src/server.h b/src/server.h
index 8c97f83f6..022e48304 100644
--- a/src/server.h
+++ b/src/server.h
@@ -1617,6 +1617,7 @@ void addReplyStatusFormat(client *c, const char *fmt, ...);
/* Client side caching (tracking mode) */
void enableTracking(client *c, uint64_t redirect_to);
void disableTracking(client *c);
+void trackingRememberKeys(client *c);
/* List data type */
void listTypeTryConversion(robj *subject, robj *value);