]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/cache/pwl: Fix pmem cache fragment issue
authorYin Congmin <congmin.yin@intel.com>
Tue, 30 Mar 2021 14:47:33 +0000 (22:47 +0800)
committerDeepika Upadhyay <dupadhya@redhat.com>
Fri, 5 Nov 2021 09:22:02 +0000 (14:52 +0530)
I/O may hang due to pmem cache fragment issue when blocks are diffrent
in size. Call pmdk API(pmemobj_defrag) to solve.

Fixes: https://tracker.ceph.com/issues/49879
Signed-off-by: Yin Congmin <congmin.yin@intel.com>
(cherry picked from commit b53392a15380b57d6111cb2926083393627f1ed7)

src/librbd/cache/pwl/rwl/WriteLog.cc

index 56bf3851c7b98e7ca510f3f0bde181bd2bc26139..e22cb62da1b3eea5237a15da9c54a75982204907 100644 (file)
@@ -920,6 +920,12 @@ void WriteLog<I>::reserve_cache(C_BlockIORequestT *req,
                                 << *req << dendl;
       alloc_succeeds = false;
       no_space = true; /* Entries need to be retired */
+
+      if (this->m_free_log_entries == this->m_total_log_entries - 1) {
+        /* When the cache is empty, there is still no space to allocate.
+         * Defragment. */
+        pmemobj_defrag(m_log_pool, NULL, 0, NULL);
+      }
       break;
     } else {
       buffer.allocated = true;