From 40962d6d85d3a36483e7448e5e397e727d47bd73 Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Thu, 28 Feb 2019 09:24:45 +0100 Subject: [PATCH] os/bluestore: Fix problem with bluefs's freespace not being balanced when kv_sync_thread is sleeping. Fixes: https://tracker.ceph.com/issues/38574 Signed-off-by: Adam Kupczyk (cherry picked from commit cbaa17c1fca858ce25c1e3de193151a8b7b10ef7) Conflicts: src/os/bluestore/BlueStore.cc: trivial resolution --- src/os/bluestore/BlueStore.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 6d601aaac83..a91e0b5a196 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -8692,18 +8692,24 @@ void BlueStore::_kv_sync_thread() dout(10) << __func__ << " start" << dendl; std::unique_lock l(kv_lock); assert(!kv_sync_started); + bool bluefs_do_check_balance = false; kv_sync_started = true; kv_cond.notify_all(); while (true) { assert(kv_committing.empty()); if (kv_queue.empty() && ((deferred_done_queue.empty() && deferred_stable_queue.empty()) || - !deferred_aggressive)) { + !deferred_aggressive) && + (bluefs_do_check_balance == false)) { if (kv_stop) break; dout(20) << __func__ << " sleep" << dendl; - kv_cond.wait(l); + std::cv_status status = kv_cond.wait_for(l, + std::chrono::milliseconds(int64_t(cct->_conf->bluestore_bluefs_balance_interval * 1000))); dout(20) << __func__ << " wake" << dendl; + if (status == std::cv_status::timeout) { + bluefs_do_check_balance = true; + } } else { deque kv_submitting; deque deferred_done, deferred_stable; @@ -8838,6 +8844,7 @@ void BlueStore::_kv_sync_thread() synct->set(PREFIX_SUPER, "bluefs_extents", bl); } } + bluefs_do_check_balance = false; // cleanup sync deferred keys for (auto b : deferred_stable) { -- 2.47.3