X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/404a56a1e97bf9df334a8311dd984d1d148742cb..refs/heads/master:/src/migrate.c?ds=inline diff --git a/src/migrate.c b/src/migrate.c index a08aa961..a998c5f0 100644 --- a/src/migrate.c +++ b/src/migrate.c @@ -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; @@ -276,16 +284,16 @@ int startKeyArchive(void) { ret = mdb_env_set_maxdbs(env, 1); if (ret != 0) return ret; - mkdir(server.mdb_environment, 0644); + mkdir(server.mdb_environment, 0755); - ret = mdb_env_open(env, server.mdb_environment, MDB_FIXEDMAP | MDB_NOSYNC, 0664); + ret = mdb_env_open(env, server.mdb_environment, MDB_FIXEDMAP | MDB_NOSYNC, 0644); if (ret != 0) return ret; MDB_txn *txn; ret = mdb_txn_begin(env, NULL, 0, &txn); if (ret != 0) return ret; - ret = mdb_open(txn, NULL, 0, &dbi); + ret = mdb_dbi_open(txn, NULL, 0, &dbi); if (ret != 0) return ret; mdb_txn_commit(txn); @@ -398,3 +406,58 @@ 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); +} + +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; +}