Calculate the incremental rehash time more precisely (#13063)
In the `databasesCron()`, the time consumed by `kvstoreIncrementallyRehash()` is used to calculate the exit condition. However, within `kvstoreIncrementallyRehash()`, the loop first checks for timeout before performing rehashing. Therefore, the time for the last rehash isn't accounted for, making the consumed time inaccurate. We need to precisely calculate all the time spent on rehashing. Additionally, the time allocated to `kvstoreIncrementallyRehash()` should be the remaining time, which is `INCREMENTAL_REHASHING_THRESHOLD_US` minus the already consumed `elapsed_us`.
This commit is contained in:
parent
9103ccc398
commit
8876d264ac
@ -615,16 +615,16 @@ uint64_t kvstoreIncrementallyRehash(kvstore *kvs, uint64_t threshold_us) {
|
||||
* after each dictionary completes rehashing, it removes itself from the list. */
|
||||
listNode *node;
|
||||
monotime timer;
|
||||
uint64_t elapsed_us = UINT64_MAX;
|
||||
uint64_t elapsed_us = 0;
|
||||
elapsedStart(&timer);
|
||||
while ((node = listFirst(kvs->rehashing))) {
|
||||
dictRehashMicroseconds(listNodeValue(node), threshold_us - elapsed_us);
|
||||
|
||||
elapsed_us = elapsedUs(timer);
|
||||
if (elapsed_us >= threshold_us) {
|
||||
break; /* Reached the time limit. */
|
||||
}
|
||||
dictRehashMicroseconds(listNodeValue(node), threshold_us - elapsed_us);
|
||||
}
|
||||
assert(elapsed_us != UINT64_MAX);
|
||||
return elapsed_us;
|
||||
}
|
||||
|
||||
|
@ -1093,10 +1093,10 @@ void databasesCron(void) {
|
||||
uint64_t elapsed_us = 0;
|
||||
for (j = 0; j < dbs_per_call; j++) {
|
||||
redisDb *db = &server.db[rehash_db % server.dbnum];
|
||||
elapsed_us += kvstoreIncrementallyRehash(db->keys, INCREMENTAL_REHASHING_THRESHOLD_US);
|
||||
elapsed_us += kvstoreIncrementallyRehash(db->keys, INCREMENTAL_REHASHING_THRESHOLD_US - elapsed_us);
|
||||
if (elapsed_us >= INCREMENTAL_REHASHING_THRESHOLD_US)
|
||||
break;
|
||||
elapsed_us += kvstoreIncrementallyRehash(db->expires, INCREMENTAL_REHASHING_THRESHOLD_US);
|
||||
elapsed_us += kvstoreIncrementallyRehash(db->expires, INCREMENTAL_REHASHING_THRESHOLD_US - elapsed_us);
|
||||
if (elapsed_us >= INCREMENTAL_REHASHING_THRESHOLD_US)
|
||||
break;
|
||||
rehash_db++;
|
||||
|
Loading…
x
Reference in New Issue
Block a user