Skip to content

Commit 0e56a09

Browse files
committed
fix: do not crash upon inconsistent expire iterator (#4658)
Fixes #4656 Signed-off-by: Roman Gershman <[email protected]>
1 parent 21b19e9 commit 0e56a09

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

src/server/db_slice.cc

+11-4
Original file line numberDiff line numberDiff line change
@@ -1220,17 +1220,24 @@ auto DbSlice::DeleteExpiredStep(const Context& cntx, unsigned count) -> DeleteEx
12201220
std::string stash;
12211221

12221222
auto cb = [&](ExpireIterator it) {
1223-
auto key = it->first.GetSlice(&stash);
1223+
string_view key = it->first.GetSlice(&stash);
12241224
if (!CheckLock(IntentLock::EXCLUSIVE, cntx.db_index, key))
12251225
return;
12261226

12271227
result.traversed++;
12281228
time_t ttl = ExpireTime(it) - cntx.time_now_ms;
12291229
if (ttl <= 0) {
12301230
auto prime_it = db.prime.Find(it->first);
1231-
CHECK(!prime_it.is_done());
1232-
result.deleted_bytes += prime_it->first.MallocUsed() + prime_it->second.MallocUsed();
1233-
ExpireIfNeeded(cntx, prime_it);
1231+
if (prime_it.is_done()) { // A workaround for the case our tables are inconsistent.
1232+
LOG(DFATAL) << "Expired key " << key << " not found in prime table, expire_done: "
1233+
<< it.is_done();
1234+
if (!it.is_done()) {
1235+
db.expire.Erase(it->first);
1236+
}
1237+
} else {
1238+
result.deleted_bytes += prime_it->first.MallocUsed() + prime_it->second.MallocUsed();
1239+
ExpireIfNeeded(cntx, prime_it);
1240+
}
12341241
++result.deleted;
12351242
} else {
12361243
result.survivor_ttl_sum += ttl;

0 commit comments

Comments
 (0)