From 6bd9db304f906e9e4a07ca5ce07ffffdbc1678f0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 5 Sep 2017 15:01:02 -0400 Subject: [PATCH] os/bluestore/BlueFS: prevent _compact_log_async reentry _should_compact_log uses new_log != nullptr to tell whether compaction is already in progress, but we don't set it until we are midway through the process. Set it at the top of the method to prevent reentry. See 455cc6cea2e5e8bc1126b5047b6003fa583af1b5, which failed to implement this properly. Fixes: http://tracker.ceph.com/issues/21250 Signed-off-by: Sage Weil --- src/os/bluestore/BlueFS.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index b94ae7651d4..24d4a4ef7dd 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -1187,6 +1187,11 @@ void BlueFS::_compact_log_async(std::unique_lock& l) assert(!new_log); assert(!new_log_writer); + // create a new log [writer] so that we know compaction is in progress + // (see _should_compact_log) + new_log = new File; + new_log->fnode.ino = 0; // so that _flush_range won't try to log the fnode + // 1. allocate new log space and jump to it. old_log_jump_to = log_file->fnode.get_allocated(); uint64_t need = old_log_jump_to + cct->_conf->bluefs_max_log_runway; @@ -1228,9 +1233,7 @@ void BlueFS::_compact_log_async(std::unique_lock& l) dout(10) << __func__ << " new_log_jump_to 0x" << std::hex << new_log_jump_to << std::dec << dendl; - // create a new log [writer] - new_log = new File; - new_log->fnode.ino = 0; // so that _flush_range won't try to log the fnode + // allocate int r = _allocate(BlueFS::BDEV_DB, new_log_jump_to, &new_log->fnode.extents); assert(r == 0); -- 2.39.5