Fix TEST_CompactMemTable deadlock

This CL ensures that CompactRange doesn't get stuck on waiting on background_work_finished_signal_ during shutdown.
While background_work_finished_signal_ may be in fact signaled, CompactMemTable() will never run, not giving opportunity for workers blocked in TEST_CompactMemTable to exit the loop.
We suspect this contributes to b/370844779; while the hang was mitigated
by limiting concurrency to 1 worker (which avoids filling the thread pool with
blocked workers), this issue can still happen and will block 1 worker during
shutdown.

PiperOrigin-RevId: 879794057
This commit is contained in:
leveldb Team
2026-03-06 21:29:47 +00:00
committed by Victor Costan
parent 78a352f47e
commit 4a0c572440

View File

@@ -646,7 +646,8 @@ Status DBImpl::TEST_CompactMemTable() {
if (s.ok()) { if (s.ok()) {
// Wait until the compaction completes // Wait until the compaction completes
MutexLock l(&mutex_); MutexLock l(&mutex_);
while (imm_ != nullptr && bg_error_.ok()) { while (imm_ != nullptr && bg_error_.ok() &&
!shutting_down_.load(std::memory_order_acquire)) {
background_work_finished_signal_.Wait(); background_work_finished_signal_.Wait();
} }
if (imm_ != nullptr) { if (imm_ != nullptr) {