diff options
author | menwen <menwenjun@gmail.com> | 2021-08-05 16:09:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-05 11:09:24 +0300 |
commit | ca559819f7dcd97ba9ef667bf38360a9527d62f6 (patch) | |
tree | 4b0e57c64171168126faaccd0f18a1afeb8f7a43 | |
parent | d32f8641ed5cda76234f7405d2b65e167223a9f1 (diff) | |
download | redis-ca559819f7dcd97ba9ef667bf38360a9527d62f6.tar.gz |
Add latency monitor sample when key is deleted via lazy expire (#9317)
Fix that there is no sample latency after the key expires via expireIfNeeded().
Some refactoring for shared code.
-rw-r--r-- | src/db.c | 28 | ||||
-rw-r--r-- | src/expire.c | 15 | ||||
-rw-r--r-- | src/server.h | 1 |
3 files changed, 20 insertions, 24 deletions
@@ -30,6 +30,7 @@ #include "server.h" #include "cluster.h" #include "atomicvar.h" +#include "latency.h" #include <signal.h> #include <ctype.h> @@ -1437,6 +1438,22 @@ long long getExpire(redisDb *db, robj *key) { return dictGetSignedIntegerVal(de); } +/* Delete the specified expired key and propagate expire. */ +void deleteExpiredKeyAndPropagate(redisDb *db, robj *keyobj) { + mstime_t expire_latency; + latencyStartMonitor(expire_latency); + if (server.lazyfree_lazy_expire) + dbAsyncDelete(db,keyobj); + else + dbSyncDelete(db,keyobj); + latencyEndMonitor(expire_latency); + latencyAddSampleIfNeeded("expire-del",expire_latency); + notifyKeyspaceEvent(NOTIFY_EXPIRED,"expired",keyobj,db->id); + signalModifiedKey(NULL, db, keyobj); + propagateExpire(db,keyobj,server.lazyfree_lazy_expire); + server.stat_expiredkeys++; +} + /* Propagate expires into slaves and the AOF file. * When a key expires in the master, a DEL operation for this key is sent * to all the slaves and the AOF file if enabled. @@ -1541,16 +1558,7 @@ int expireIfNeeded(redisDb *db, robj *key) { if (checkClientPauseTimeoutAndReturnIfPaused()) return 1; /* Delete the key */ - if (server.lazyfree_lazy_expire) { - dbAsyncDelete(db,key); - } else { - dbSyncDelete(db,key); - } - server.stat_expiredkeys++; - propagateExpire(db,key,server.lazyfree_lazy_expire); - notifyKeyspaceEvent(NOTIFY_EXPIRED, - "expired",key,db->id); - signalModifiedKey(NULL,db,key); + deleteExpiredKeyAndPropagate(db,key); return 1; } diff --git a/src/expire.c b/src/expire.c index 858c13549..798651255 100644 --- a/src/expire.c +++ b/src/expire.c @@ -53,24 +53,11 @@ * to the function to avoid too many gettimeofday() syscalls. */ int activeExpireCycleTryExpire(redisDb *db, dictEntry *de, long long now) { long long t = dictGetSignedIntegerVal(de); - mstime_t expire_latency; if (now > t) { sds key = dictGetKey(de); robj *keyobj = createStringObject(key,sdslen(key)); - - propagateExpire(db,keyobj,server.lazyfree_lazy_expire); - latencyStartMonitor(expire_latency); - if (server.lazyfree_lazy_expire) - dbAsyncDelete(db,keyobj); - else - dbSyncDelete(db,keyobj); - latencyEndMonitor(expire_latency); - latencyAddSampleIfNeeded("expire-del",expire_latency); - notifyKeyspaceEvent(NOTIFY_EXPIRED, - "expired",keyobj,db->id); - signalModifiedKey(NULL, db, keyobj); + deleteExpiredKeyAndPropagate(db,keyobj); decrRefCount(keyobj); - server.stat_expiredkeys++; return 1; } else { return 0; diff --git a/src/server.h b/src/server.h index 5516dab29..dbef3c2de 100644 --- a/src/server.h +++ b/src/server.h @@ -2377,6 +2377,7 @@ void initConfigValues(); /* db.c -- Keyspace access API */ int removeExpire(redisDb *db, robj *key); +void deleteExpiredKeyAndPropagate(redisDb *db, robj *keyobj); void propagateExpire(redisDb *db, robj *key, int lazy); int keyIsExpired(redisDb *db, robj *key); int expireIfNeeded(redisDb *db, robj *key); |