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 authored and Victor Costan committed 2026-03-11 03:33:14 +00:00
1 parent 78a352f47e
commit 4a0c572440
1 file changed
+2 -1
+2 -1
View File
@@ -646,7 +646,8 @@ Status DBImpl::TEST_CompactMemTable() {
if (s.ok()) {
// Wait until the compaction completes
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();
}
if (imm_ != nullptr) {