From b53392a15380b57d6111cb2926083393627f1ed7 Mon Sep 17 00:00:00 2001 From: Yin Congmin Date: Tue, 30 Mar 2021 22:47:33 +0800 Subject: [PATCH] librbd/cache/pwl: Fix pmem cache fragment issue 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 --- src/librbd/cache/pwl/rwl/WriteLog.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/librbd/cache/pwl/rwl/WriteLog.cc b/src/librbd/cache/pwl/rwl/WriteLog.cc index 4f563d739da1..a9b5e708b9e1 100644 --- a/src/librbd/cache/pwl/rwl/WriteLog.cc +++ b/src/librbd/cache/pwl/rwl/WriteLog.cc @@ -897,6 +897,12 @@ void WriteLog::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; -- 2.47.3