pid_t childpid;
if (server.bgrewritechildpid != -1) return REDIS_ERR;
- redisAssert(server.ds_enabled == 0);
+ if (server.ds_enabled != 0) {
+ redisLog(REDIS_WARNING,"BGREWRITEAOF called with diskstore enabled: AOF is not supported when diskstore is enabled. Operation not performed.");
+ return REDIS_ERR;
+ }
if ((childpid = fork()) == 0) {
/* Child */
char tmpfile[256];
return dictDelete(db->dict,key->ptr) == DICT_OK;
}
-/* Empty the whole database */
+/* Empty the whole database.
+ * If diskstore is enabled this function will just flush the in-memory cache. */
long long emptyDb() {
int j;
long long removed = 0;
removed += dictSize(server.db[j].dict);
dictEmpty(server.db[j].dict);
dictEmpty(server.db[j].expires);
+ if (server.ds_enabled) dictEmpty(server.db[j].io_negcache);
}
return removed;
}
void debugCommand(redisClient *c) {
if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
*((char*)-1) = 'x';
+ } else if (!strcasecmp(c->argv[1]->ptr,"flushcache")) {
+ if (!server.ds_enabled) {
+ addReplyError(c, "DEBUG FLUSHCACHE called with diskstore off.");
+ return;
+ } else {
+ emptyDb();
+ addReply(c,shared.ok);
+ return;
+ }
} else if (!strcasecmp(c->argv[1]->ptr,"reload")) {
+ if (server.ds_enabled) {
+ addReply(c,shared.ok);
+ return;
+ }
if (rdbSave(server.dbfilename) != REDIS_OK) {
addReply(c,shared.err);
return;
/* Use RENAME to make sure the DB file is changed atomically only
* if the generate DB file is ok. */
if (rename(tmpfile,filename) == -1) {
- redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s", strerror(errno));
+ redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s (diskstore)", strerror(errno));
unlink(tmpfile);
dsRdbSaveSetState(REDIS_BGSAVE_THREAD_DONE_ERR);
return NULL;
* are swappable objects */
int maxtries = 100;
- if (dictSize(db->dict) == 0) continue;
- for (i = 0; i < 5; i++) {
+ for (i = 0; i < 5 && dictSize(db->dict); i++) {
dictEntry *de;
double swappability;
robj keyobj;
set ::port 16379
set ::traceleaks 0
set ::valgrind 0
-set ::verbose 0
+set ::verbose 1
set ::denytags {}
set ::allowtags {}
set ::external 0; # If "1" this means, we are running against external instance
}
proc cleanup {} {
- if {$::diskstore} {
- puts "Cleanup: warning may take some minute (diskstore enabled)"
- }
+ puts "Cleanup: warning may take some time..."
catch {exec rm -rf {*}[glob tests/tmp/redis.conf.*]}
catch {exec rm -rf {*}[glob tests/tmp/server.*]}
}
proc execute_everything {} {
+ if 0 {
execute_tests "unit/auth"
execute_tests "unit/protocol"
execute_tests "unit/basic"
execute_tests "integration/aof"
# execute_tests "integration/redis-cli"
execute_tests "unit/pubsub"
+ }
# run tests with diskstore enabled
set ::diskstore 1
+ lappend ::denytags nodiskstore
set ::global_overrides {diskstore-enabled yes}
execute_tests "unit/protocol"
execute_tests "unit/basic"
set _ $err
} {*invalid*}
- tags {consistency} {
+ tags {consistency nodiskstore} {
if {![catch {package require sha1}]} {
test {Check consistency of different data types after a reload} {
r flushdb
r flushdb
r set x 10
r expire x 1000
- r save
- r debug reload
+ if {$::diskstore} {
+ r debug flushcache
+ } else {
+ r save
+ r debug reload
+ }
set ttl [r ttl x]
set e1 [expr {$ttl > 900 && $ttl <= 1000}]
- r bgrewriteaof
- waitForBgrewriteaof r
+ if {!$::diskstore} {
+ r bgrewriteaof
+ waitForBgrewriteaof r
+ r debug loadaof
+ }
set ttl [r ttl x]
set e2 [expr {$ttl > 900 && $ttl <= 1000}]
list $e1 $e2