X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/8e2a225aa6cd1848a282d3d96742759cc24fc7e8..35e29472609cb3345809d48f0b4e7c75b6c1be6f:/src/migrate.c diff --git a/src/migrate.c b/src/migrate.c index a00f0e63..59d2ed5a 100644 --- a/src/migrate.c +++ b/src/migrate.c @@ -252,41 +252,52 @@ socket_rd_err: return; } -void mdb(void) { - int ret; +void stopKeyArchive(void) { + redisAssert(env != NULL); - if (env != NULL) - return; + mdb_dbi_close(env, dbi); + mdb_env_close(env); + env = NULL; + + server.mdb_state = REDIS_MDB_OFF; +} + +int startKeyArchive(void) { + redisAssert(env == NULL); + + int ret; ret = mdb_env_create(&env); - redisAssert(ret == 0); + if (ret != 0) return ret; ret = mdb_env_set_mapsize(env, server.mdb_mapsize); - redisAssert(ret == 0); + if (ret != 0) return ret; ret = mdb_env_set_maxdbs(env, 1); - redisAssert(ret == 0); + 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); - redisAssert(ret == 0); + 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); - redisAssert(ret == 0); + if (ret != 0) return ret; ret = mdb_open(txn, NULL, 0, &dbi); - redisAssert(ret == 0); + if (ret != 0) return ret; mdb_txn_commit(txn); + + server.mdb_state = REDIS_MDB_ON; + return 0; } int archive(redisDb *db, robj *key) { if (server.mdb_state == REDIS_MDB_OFF) return 1; - - mdb(); + redisAssert(env != NULL); MDB_val kval; kval.mv_data = key->ptr; @@ -298,7 +309,7 @@ int archive(redisDb *db, robj *key) { return 0; if (object->archived != 0) - return 0; + return 1; rio payload; createDumpPayload(&payload, object); @@ -336,8 +347,6 @@ robj *recover(redisDb *db, robj *key) { int ret; - mdb(); - MDB_val kval; kval.mv_data = key->ptr; kval.mv_size = sdslen((sds)key->ptr); @@ -389,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); +}