From 588ff2275bd2f3c08111b9e6a8ff54b1a3e24341 Mon Sep 17 00:00:00 2001 From: Yang Honggang Date: Thu, 26 Mar 2020 17:11:55 +0000 Subject: [PATCH] os/bluestore: Don't pollute old journal when add new device Fixes: https://tracker.ceph.com/issues/44774 Signed-off-by: Yang Honggang (cherry picked from commit ade4d46981e660c8d57cec64180b5afa4561b945) --- src/os/bluestore/BlueFS.cc | 8 ++++++-- src/os/bluestore/BlueFS.h | 8 +++++--- src/os/bluestore/BlueStore.cc | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 16a5b223f561..239b71f9c098 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -309,10 +309,12 @@ uint64_t BlueFS::get_block_device_size(unsigned id) return 0; } -void BlueFS::_add_block_extent(unsigned id, uint64_t offset, uint64_t length) +void BlueFS::_add_block_extent(unsigned id, uint64_t offset, uint64_t length, + bool skip) { dout(1) << __func__ << " bdev " << id << " 0x" << std::hex << offset << "~" << length << std::dec + << " skip " << skip << dendl; ceph_assert(id < bdev.size()); @@ -321,7 +323,9 @@ void BlueFS::_add_block_extent(unsigned id, uint64_t offset, uint64_t length) block_all[id].insert(offset, length); if (id < alloc.size() && alloc[id]) { - log_t.op_alloc_add(id, offset, length); + if (!skip) + log_t.op_alloc_add(id, offset, length); + alloc[id]->init_add_free(offset, length); } diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 8045f39c4496..e3588bfd5c06 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -431,7 +431,8 @@ private: return 4096; } - void _add_block_extent(unsigned bdev, uint64_t offset, uint64_t len); + void _add_block_extent(unsigned bdev, uint64_t offset, uint64_t len, + bool skip=false); public: BlueFS(CephContext* cct); @@ -534,9 +535,10 @@ public: uint64_t get_block_device_size(unsigned bdev); /// gift more block space - void add_block_extent(unsigned bdev, uint64_t offset, uint64_t len) { + void add_block_extent(unsigned bdev, uint64_t offset, uint64_t len, + bool skip=false) { std::unique_lock l(lock); - _add_block_extent(bdev, offset, len); + _add_block_extent(bdev, offset, len, skip); int r = _flush_and_sync_log(l); ceph_assert(r == 0); } diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 14c20bc01698..2f3278aeef96 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6565,7 +6565,7 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path) bluefs->add_block_extent( id, reserved, - bluefs->get_block_device_size(id) - reserved); + bluefs->get_block_device_size(id) - reserved, true); r = bluefs->prepare_new_device(id, bluefs_layout); ceph_assert(r == 0); -- 2.47.3