]> git.saurik.com Git - redis.git/blobdiff - src/migrate.c
Query the archive to provide a complete KEYS list.
[redis.git] / src / migrate.c
index 6d8aad7f5c48f5b5c10705ef4c376a74c99db9e1..a998c5f08841e65703949bdbd626b66e4b2cab20 100644 (file)
@@ -255,7 +255,15 @@ socket_rd_err:
 void stopKeyArchive(void) {
     redisAssert(env != NULL);
 
-    mdb_dbi_close(env, dbi);
+    MDB_txn *txn;
+    int ret = mdb_txn_begin(env, NULL, 0, &txn);
+    if (ret != 0)
+        mdb_txn_abort(txn);
+    else {
+        mdb_dbi_close(env, dbi);
+        mdb_txn_commit(txn);
+    }
+
     mdb_env_close(env);
     env = NULL;
 
@@ -422,3 +430,34 @@ void purge(robj *key) {
 
     mdb_txn_commit(txn);
 }
+
+int rummage(redisClient *c, unsigned long *numkeys) {
+    if (server.mdb_state == REDIS_MDB_OFF)
+        return REDIS_OK;
+
+    int ret;
+
+    MDB_txn *txn;
+    ret = mdb_txn_begin(env, NULL, 0, &txn);
+    if (ret != 0)
+        return REDIS_ERR;
+
+    MDB_cursor *cursor;
+    ret = mdb_cursor_open(txn, dbi, &cursor);
+    if (ret != 0) {
+        mdb_txn_abort(txn);
+        return REDIS_ERR;
+    }
+
+    MDB_val kval;
+    while ((ret = mdb_cursor_get(cursor, &kval, NULL, MDB_NEXT)) == 0) {
+        robj *key = createStringObject(kval.mv_data, kval.mv_size);
+        addReplyBulk(c, key);
+        ++*numkeys;
+        decrRefCount(key);
+    }
+
+    mdb_cursor_close(cursor);
+    mdb_txn_abort(txn);
+    return REDIS_OK;
+}