In databasesCron() never test more DBs than we have.

This commit is contained in:
antirez 2013-03-11 10:51:03 +01:00
parent 4b1ccdfd49
commit 08b107e405

View File

@ -650,8 +650,12 @@ void updateDictResizePolicy(void) {
void activeExpireCycle(void) { void activeExpireCycle(void) {
static unsigned int current_db = 0; static unsigned int current_db = 0;
unsigned int j, iteration = 0; unsigned int j, iteration = 0;
unsigned int dbs_per_call = REDIS_DBCRON_DBS_PER_CALL;
long long start = ustime(), timelimit; long long start = ustime(), timelimit;
/* Don't test more DBs than we have. */
if (dbs_per_call > server.dbnum) dbs_per_call = server.dbnum;
/* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time
* per iteration. Since this function gets called with a frequency of * per iteration. Since this function gets called with a frequency of
* server.hz times per second, the following is the max amount of * server.hz times per second, the following is the max amount of
@ -659,7 +663,7 @@ void activeExpireCycle(void) {
timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/server.hz/100; timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/server.hz/100;
if (timelimit <= 0) timelimit = 1; if (timelimit <= 0) timelimit = 1;
for (j = 0; j < REDIS_DBCRON_DBS_PER_CALL; j++) { for (j = 0; j < dbs_per_call; j++) {
int expired; int expired;
redisDb *db = server.db+(current_db % server.dbnum); redisDb *db = server.db+(current_db % server.dbnum);
@ -845,17 +849,21 @@ void databasesCron(void) {
* cron loop iteration. */ * cron loop iteration. */
static unsigned int resize_db = 0; static unsigned int resize_db = 0;
static unsigned int rehash_db = 0; static unsigned int rehash_db = 0;
unsigned int dbs_per_call = REDIS_DBCRON_DBS_PER_CALL;
unsigned int j; unsigned int j;
/* Don't test more DBs than we have. */
if (dbs_per_call > server.dbnum) dbs_per_call = server.dbnum;
/* Resize */ /* Resize */
for (j = 0; j < REDIS_DBCRON_DBS_PER_CALL; j++) { for (j = 0; j < dbs_per_call; j++) {
tryResizeHashTables(resize_db % server.dbnum); tryResizeHashTables(resize_db % server.dbnum);
resize_db++; resize_db++;
} }
/* Rehash */ /* Rehash */
if (server.activerehashing) { if (server.activerehashing) {
for (j = 0; j < REDIS_DBCRON_DBS_PER_CALL; j++) { for (j = 0; j < dbs_per_call; j++) {
int work_done = incrementallyRehash(rehash_db % server.dbnum); int work_done = incrementallyRehash(rehash_db % server.dbnum);
rehash_db++; rehash_db++;
if (work_done) { if (work_done) {