]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Fix problem with bluefs's freespace not being balanced when kv_sync_thr... 26866/head
authorAdam Kupczyk <akupczyk@redhat.com>
Thu, 28 Feb 2019 08:24:45 +0000 (09:24 +0100)
committerNeha Ojha <nojha@redhat.com>
Fri, 8 Mar 2019 21:53:38 +0000 (16:53 -0500)
Fixes: https://tracker.ceph.com/issues/38574
Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
(cherry picked from commit cbaa17c1fca858ce25c1e3de193151a8b7b10ef7)

Conflicts:
src/os/bluestore/BlueStore.cc: trivial resolution

src/os/bluestore/BlueStore.cc

index 6d601aaac83ab33de5ab040b49c1724e326c1457..a91e0b5a196c495f44e2d1c50469ff930ef7cf51 100644 (file)
@@ -8692,18 +8692,24 @@ void BlueStore::_kv_sync_thread()
   dout(10) << __func__ << " start" << dendl;
   std::unique_lock<std::mutex> 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<TransContext*> kv_submitting;
       deque<DeferredBatch*> 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) {