Skip to content

Commit

Permalink
Add 'WithSlot' expiry API and update RANDOMKEY command
Browse files Browse the repository at this point in the history
Signed-off-by: Nadav Levanoni <[email protected]>
  • Loading branch information
nadavl-a committed Oct 14, 2024
1 parent d272086 commit 0e4e2e1
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions src/db.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,11 +404,10 @@ robj *dbRandomKey(serverDb *db) {
}
}

/* Helper for sync and async delete. */
int dbGenericDelete(serverDb *db, robj *key, int async, int flags) {
int dbGenericDeleteWithSlot(serverDb *db, robj *key, int async, int flags, int slot) {
dictEntry **plink;
int table;
int dict_index = getKVStoreIndexForKey(key->ptr);
int dict_index = slot;
dictEntry *de = kvstoreDictTwoPhaseUnlinkFind(db->keys, dict_index, key->ptr, &plink, &table);
if (de) {
robj *val = dictGetVal(de);
Expand Down Expand Up @@ -438,6 +437,12 @@ int dbGenericDelete(serverDb *db, robj *key, int async, int flags) {
}
}

/* Helper for sync and async delete. */
int dbGenericDelete(serverDb *db, robj *key, int async, int flags) {
int slot = server.cluster_enabled ? getKeySlot(key->ptr) : 0;
return dbGenericDeleteWithSlot(db, key, async, flags, slot);
}

/* Delete a key, value, and associated expiration entry if any, from the DB */
int dbSyncDelete(serverDb *db, robj *key) {
return dbGenericDelete(db, key, 0, DB_FLAG_KEY_DELETED);
Expand Down Expand Up @@ -1710,11 +1715,10 @@ long long getExpire(serverDb *db, robj *key) {
return getExpireWithSlot(db, key, slot);
}

/* Delete the specified expired key and propagate expire. */
void deleteExpiredKeyAndPropagate(serverDb *db, robj *keyobj) {
void deleteExpiredKeyAndPropagateWithSlot(serverDb *db, robj *keyobj, int slot) {
mstime_t expire_latency;
latencyStartMonitor(expire_latency);
dbGenericDelete(db, keyobj, server.lazyfree_lazy_expire, DB_FLAG_KEY_EXPIRED);
dbGenericDeleteWithSlot(db, keyobj, server.lazyfree_lazy_expire, DB_FLAG_KEY_EXPIRED, slot);
latencyEndMonitor(expire_latency);
latencyAddSampleIfNeeded("expire-del", expire_latency);
notifyKeyspaceEvent(NOTIFY_EXPIRED, "expired", keyobj, db->id);
Expand All @@ -1723,6 +1727,12 @@ void deleteExpiredKeyAndPropagate(serverDb *db, robj *keyobj) {
server.stat_expiredkeys++;
}

/* Delete the specified expired key and propagate expire. */
void deleteExpiredKeyAndPropagate(serverDb *db, robj *keyobj) {
int slot = server.cluster_enabled ? getKeySlot(keyobj->ptr) : 0;
deleteExpiredKeyAndPropagateWithSlot(db, keyobj, slot);
}

/* Delete the specified expired key from overwriting and propagate the DEL or UNLINK. */
void deleteExpiredKeyFromOverwriteAndPropagate(client *c, robj *keyobj) {
int deleted = dbGenericDelete(c->db, keyobj, server.lazyfree_lazy_expire, DB_FLAG_KEY_EXPIRED);
Expand Down Expand Up @@ -1833,7 +1843,7 @@ keyStatus expireIfNeededWithSlot(serverDb *db, robj *key, int flags, int slot) {
key = createStringObject(key->ptr, sdslen(key->ptr));
}
/* Delete the key */
deleteExpiredKeyAndPropagate(db, key);
deleteExpiredKeyAndPropagateWithSlot(db, key, slot);
if (static_key) {
decrRefCount(key);
}
Expand Down Expand Up @@ -1916,12 +1926,8 @@ int dbExpandExpires(serverDb *db, uint64_t db_size, int try_expand) {
return dbExpandGeneric(db->expires, db_size, try_expand);
}

static dictEntry *dbFindGenericWithSlot(kvstore *kvs, void *key, int slot) {
return kvstoreDictFind(kvs, slot, key);
}

dictEntry *dbFindWithSlot(serverDb *db, void *key, int slot) {
return dbFindGenericWithSlot(db->keys, key, slot);
return kvstoreDictFind(db->keys, slot, key);
}

dictEntry *dbFind(serverDb *db, void *key) {
Expand All @@ -1930,7 +1936,7 @@ dictEntry *dbFind(serverDb *db, void *key) {
}

dictEntry *dbFindExpiresWithSlot(serverDb *db, void *key, int slot) {
return dbFindGenericWithSlot(db->expires, key, slot);
return kvstoreDictFind(db->expires, slot, key);
}

dictEntry *dbFindExpires(serverDb *db, void *key) {
Expand Down

0 comments on commit 0e4e2e1

Please sign in to comment.