From 35e29472609cb3345809d48f0b4e7c75b6c1be6f Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sun, 23 Dec 2012 09:29:46 +0000 Subject: [PATCH 1/1] Delete keys from the archive when deleting from DB. --- src/db.c | 8 +++++++- src/migrate.c | 24 ++++++++++++++++++++++++ src/redis.c | 2 +- src/redis.h | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/db.c b/src/db.c index 61e57699..067a0247 100644 --- a/src/db.c +++ b/src/db.c @@ -162,7 +162,7 @@ robj *dbRandomKey(redisDb *db) { } /* Delete a key, value, and associated expiration entry if any, from the DB */ -int dbDelete(redisDb *db, robj *key) { +int dbDeleteSoft(redisDb *db, robj *key) { /* Deleting an entry from the expires dict will not free the sds of * the key, because it is shared with the main dictionary. */ if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr); @@ -173,6 +173,12 @@ int dbDelete(redisDb *db, robj *key) { } } +/* Delete a key, value, and associated expiration entry if any, even archived */ +int dbDelete(redisDb *db, robj *key) { + purge(key); + return dbDeleteSoft(db, key); +} + long long emptyDb() { int j; long long removed = 0; diff --git a/src/migrate.c b/src/migrate.c index 8cddc502..59d2ed5a 100644 --- a/src/migrate.c +++ b/src/migrate.c @@ -398,3 +398,27 @@ recover_err: sdsfree(sval); return NULL; } + +void purge(robj *key) { + if (server.mdb_state == REDIS_MDB_OFF) + return; + + int ret; + + MDB_val kval; + kval.mv_data = key->ptr; + kval.mv_size = sdslen((sds)key->ptr); + + MDB_txn *txn; + ret = mdb_txn_begin(env, NULL, 0, &txn); + if (ret != 0) + return; + + ret = mdb_del(txn, dbi, &kval, NULL); + if (ret != 0) { + mdb_txn_abort(txn); + return; + } + + mdb_txn_commit(txn); +} diff --git a/src/redis.c b/src/redis.c index 2cc46e5b..00eaab2a 100644 --- a/src/redis.c +++ b/src/redis.c @@ -2362,7 +2362,7 @@ int freeMemoryIfNeeded(void) { * AOF and Output buffer memory will be freed eventually so * we only care about memory used by the key space. */ delta = (long long) zmalloc_used_memory(); - dbDelete(db,keyobj); + dbDeleteSoft(db,keyobj); delta -= (long long) zmalloc_used_memory(); mem_freed += delta; server.stat_evictedkeys++; diff --git a/src/redis.h b/src/redis.h index dc4e325a..92598b03 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1026,6 +1026,7 @@ void dbOverwrite(redisDb *db, robj *key, robj *val); void setKey(redisDb *db, robj *key, robj *val); int dbExists(redisDb *db, robj *key); robj *dbRandomKey(redisDb *db); +int dbDeleteSoft(redisDb *db, robj *key); int dbDelete(redisDb *db, robj *key); long long emptyDb(); int selectDb(redisClient *c, int id); @@ -1038,6 +1039,7 @@ void stopKeyArchive(void); int startKeyArchive(void); robj *recover(redisDb *db, robj *key); int archive(redisDb *db, robj *key); +void purge(robj *key); /* API to get key arguments from commands */ #define REDIS_GETKEYS_ALL 0 -- 2.47.2