summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-05-14 16:04:41 +0200
committerantirez <antirez@gmail.com>2012-05-14 17:43:26 +0200
commiteee680541b4ce3abbb86c39f47932c648fe478f5 (patch)
tree927d8aa004862686ef3fe4b79d4bb7378d642dca
parenta8a981a834f1e8704ed2250ec14646e01760756b (diff)
downloadredis-eee680541b4ce3abbb86c39f47932c648fe478f5.tar.gz
activeExpireCycle(): better precision in max time used.
activeExpireCycle() can consume no more than a few milliseconds per iteration. This commit improves the precision of the check for the time elapsed in two ways: 1) We check every 16 iterations instead of the main loop instead of 256. 2) We reset iterations at the start of the function and not every time we switch to the next database, so the check is correctly performed every 16 iterations.
-rw-r--r--src/redis.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/redis.c b/src/redis.c
index 48d032b6c..e12d27cc3 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -614,7 +614,7 @@ void updateDictResizePolicy(void) {
* it will get more aggressive to avoid that too much memory is used by
* keys that can be removed from the keyspace. */
void activeExpireCycle(void) {
- int j;
+ int j, iteration = 0;
long long start = ustime(), timelimit;
/* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time
@@ -625,7 +625,7 @@ void activeExpireCycle(void) {
if (timelimit <= 0) timelimit = 1;
for (j = 0; j < server.dbnum; j++) {
- int expired, iteration = 0;
+ int expired;
redisDb *db = server.db+j;
/* Continue to expire if at the end of the cycle more than 25%
@@ -641,6 +641,8 @@ void activeExpireCycle(void) {
if (num && slots > DICT_HT_INITIAL_SIZE &&
(num*100/slots < 1)) break;
+ /* The main collection cycle. Sample random keys among keys
+ * with an expire set, checking for expired ones. */
expired = 0;
if (num > REDIS_EXPIRELOOKUPS_PER_CRON)
num = REDIS_EXPIRELOOKUPS_PER_CRON;
@@ -665,7 +667,7 @@ void activeExpireCycle(void) {
* expire. So after a given amount of milliseconds return to the
* caller waiting for the other active expire cycle. */
iteration++;
- if ((iteration & 0xff) == 0 && /* Check once every 255 iterations */
+ if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */
(ustime()-start) > timelimit) return;
} while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);
}