From 1c776ab0f0e43a7a3f0329df0ba8c35e61f078b8 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 11cd606f589f3..9d6525c52f961 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -310,10 +310,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()); @@ -322,7 +324,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 439095f467932..330080d38704b 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); @@ -532,9 +533,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 954dffa4531f5..7af9ddaa98d68 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6259,7 +6259,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); ceph_assert(r == 0); -- 2.39.5