mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 10:25:47 +02:00
fix: do not crash upon inconsistent expire iterator (#4658)
Fixes #4656 Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
parent
21b19e9abb
commit
0e56a09f70
1 changed files with 11 additions and 4 deletions
|
@ -1220,7 +1220,7 @@ auto DbSlice::DeleteExpiredStep(const Context& cntx, unsigned count) -> DeleteEx
|
||||||
std::string stash;
|
std::string stash;
|
||||||
|
|
||||||
auto cb = [&](ExpireIterator it) {
|
auto cb = [&](ExpireIterator it) {
|
||||||
auto key = it->first.GetSlice(&stash);
|
string_view key = it->first.GetSlice(&stash);
|
||||||
if (!CheckLock(IntentLock::EXCLUSIVE, cntx.db_index, key))
|
if (!CheckLock(IntentLock::EXCLUSIVE, cntx.db_index, key))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1228,9 +1228,16 @@ auto DbSlice::DeleteExpiredStep(const Context& cntx, unsigned count) -> DeleteEx
|
||||||
time_t ttl = ExpireTime(it) - cntx.time_now_ms;
|
time_t ttl = ExpireTime(it) - cntx.time_now_ms;
|
||||||
if (ttl <= 0) {
|
if (ttl <= 0) {
|
||||||
auto prime_it = db.prime.Find(it->first);
|
auto prime_it = db.prime.Find(it->first);
|
||||||
CHECK(!prime_it.is_done());
|
if (prime_it.is_done()) { // A workaround for the case our tables are inconsistent.
|
||||||
result.deleted_bytes += prime_it->first.MallocUsed() + prime_it->second.MallocUsed();
|
LOG(DFATAL) << "Expired key " << key << " not found in prime table, expire_done: "
|
||||||
ExpireIfNeeded(cntx, prime_it);
|
<< it.is_done();
|
||||||
|
if (!it.is_done()) {
|
||||||
|
db.expire.Erase(it->first);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.deleted_bytes += prime_it->first.MallocUsed() + prime_it->second.MallocUsed();
|
||||||
|
ExpireIfNeeded(cntx, prime_it);
|
||||||
|
}
|
||||||
++result.deleted;
|
++result.deleted;
|
||||||
} else {
|
} else {
|
||||||
result.survivor_ttl_sum += ttl;
|
result.survivor_ttl_sum += ttl;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue