]> git.saurik.com Git - redis.git/commitdiff
Delete keys from the archive when deleting from DB.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Dec 2012 09:29:46 +0000 (09:29 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Dec 2012 09:29:46 +0000 (09:29 +0000)
src/db.c
src/migrate.c
src/redis.c
src/redis.h

index 61e5769968e7445c7d86485b870192c0e73ea909..067a024716b69091c3edbef2848bb3bf05d156e9 100644 (file)
--- 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;
index 8cddc502a9110183660ce542c5d7a0d3e9f0ddaf..59d2ed5a18b2ecd9e29fd6a67f7abecc84e0c8ef 100644 (file)
@@ -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);
+}
index 2cc46e5b47c132a99c0369bdaea12ca0aa8b92bf..00eaab2a0759b47ca190ae21b48162dfb4a33808 100644 (file)
@@ -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++;
index dc4e325ad42666593ca5783cc839bd612f346482..92598b03af60d72ec8431b4b3e32c758bbf788ba 100644 (file)
@@ -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