From: Radoslaw Zarzynski Date: Wed, 11 Sep 2019 14:42:37 +0000 (+0200) Subject: os/bluestore: memorize layout of BlueFS on management. X-Git-Tag: v15.1.0~1312^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7203faf279003c9f278bb8b142d4aca5cada0247;p=ceph-ci.git os/bluestore: memorize layout of BlueFS on management. Fixes: https://tracker.ceph.com/issues/41744 Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 2841e3daa24..fd31e4c28aa 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -651,7 +651,7 @@ void BlueFS::umount() _shutdown_logger(); } -int BlueFS::prepare_new_device(int id) +int BlueFS::prepare_new_device(int id, const bluefs_layout_t& layout) { dout(1) << __func__ << dendl; @@ -662,14 +662,20 @@ int BlueFS::prepare_new_device(int id) new_log_dev_cur = BDEV_NEWDB; new_log_dev_next = BDEV_DB; } - _rewrite_log_sync(false, + _rewrite_log_and_layout_sync(false, BDEV_NEWDB, new_log_dev_cur, new_log_dev_next, - RENAME_DB2SLOW); + RENAME_DB2SLOW, + layout); //} } else if(id == BDEV_NEWWAL) { - _rewrite_log_sync(false, BDEV_DB, BDEV_NEWWAL, BDEV_WAL, REMOVE_WAL); + _rewrite_log_and_layout_sync(false, + BDEV_DB, + BDEV_NEWWAL, + BDEV_WAL, + REMOVE_WAL, + layout); } else { assert(false); } @@ -1179,7 +1185,8 @@ int BlueFS::log_dump() int BlueFS::device_migrate_to_existing( CephContext *cct, const set& devs_source, - int dev_target) + int dev_target, + const bluefs_layout_t& layout) { vector buf; bool buffered = cct->_conf->bluefs_buffered_io; @@ -1316,19 +1323,21 @@ int BlueFS::device_migrate_to_existing( new_log_dev_next; } - _rewrite_log_sync( + _rewrite_log_and_layout_sync( false, (flags & REMOVE_DB) ? BDEV_SLOW : BDEV_DB, new_log_dev_cur, new_log_dev_next, - flags); + flags, + layout); return 0; } int BlueFS::device_migrate_to_new( CephContext *cct, const set& devs_source, - int dev_target) + int dev_target, + const bluefs_layout_t& layout) { vector buf; bool buffered = cct->_conf->bluefs_buffered_io; @@ -1452,12 +1461,13 @@ int BlueFS::device_migrate_to_new( BDEV_DB : BDEV_SLOW; - _rewrite_log_sync( + _rewrite_log_and_layout_sync( false, super_dev, new_log_dev_cur, new_log_dev_next, - flags); + flags, + layout); return 0; } @@ -1836,19 +1846,21 @@ void BlueFS::_compact_log_dump_metadata(bluefs_transaction_t *t, void BlueFS::_compact_log_sync() { dout(10) << __func__ << dendl; - _rewrite_log_sync(true, + _rewrite_log_and_layout_sync(true, BDEV_DB, log_writer->file->fnode.prefer_bdev, log_writer->file->fnode.prefer_bdev, - 0); + 0, + super.memorized_layout); logger->inc(l_bluefs_log_compactions); } -void BlueFS::_rewrite_log_sync(bool allocate_with_fallback, - int super_dev, - int log_dev, - int log_dev_new, - int flags) +void BlueFS::_rewrite_log_and_layout_sync(bool allocate_with_fallback, + int super_dev, + int log_dev, + int log_dev_new, + int flags, + std::optional layout) { File *log_file = log_writer->file.get(); @@ -1908,6 +1920,7 @@ void BlueFS::_rewrite_log_sync(bool allocate_with_fallback, #endif flush_bdev(); + super.memorized_layout = layout; super.log_fnode = log_file->fnode; // rename device if needed if (log_dev != log_dev_new) { diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 07e3334902e..04824cdae9e 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -362,11 +362,12 @@ private: void _compact_log_sync(); void _compact_log_async(std::unique_lock& l); - void _rewrite_log_sync(bool allocate_with_fallback, - int super_dev, - int log_dev, - int new_log_dev, - int flags); + void _rewrite_log_and_layout_sync(bool allocate_with_fallback, + int super_dev, + int log_dev, + int new_log_dev, + int flags, + std::optional layout); //void _aio_finish(void *priv); @@ -419,7 +420,7 @@ public: int mount(); int maybe_verify_layout(const bluefs_layout_t& layout) const; void umount(); - int prepare_new_device(int id); + int prepare_new_device(int id, const bluefs_layout_t& layout); int log_dump(); @@ -433,11 +434,13 @@ public: int device_migrate_to_new( CephContext *cct, const set& devs_source, - int dev_target); + int dev_target, + const bluefs_layout_t& layout); int device_migrate_to_existing( CephContext *cct, const set& devs_source, - int dev_target); + int dev_target, + const bluefs_layout_t& layout); uint64_t get_used(); uint64_t get_total(unsigned id); diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 1b0d59e74e5..611dca6e634 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6353,6 +6353,7 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path) } reserved = BDEV_LABEL_BLOCK_SIZE; + bluefs_layout.dedicated_wal = true; } else if (id == BlueFS::BDEV_NEWDB) { string p = path + "/block.db"; r = _setup_block_symlink_or_file("block.db", dev_path, @@ -6373,6 +6374,8 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path) ceph_assert(r == 0); } reserved = SUPER_RESERVED; + bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW; + bluefs_layout.dedicated_db = true; } bluefs->umount(); @@ -6383,7 +6386,7 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path) reserved, bluefs->get_block_device_size(id) - reserved); - r = bluefs->prepare_new_device(id); + r = bluefs->prepare_new_device(id, bluefs_layout); ceph_assert(r == 0); if (r < 0) { @@ -6449,7 +6452,14 @@ int BlueStore::migrate_to_existing_bluefs_device(const set& devs_source, << dendl; return -ENOSPC; } - r = bluefs->device_migrate_to_existing(cct, devs_source, id); + if (devs_source.count(BlueFS::BDEV_DB)) { + bluefs_layout.shared_bdev = BlueFS::BDEV_DB; + bluefs_layout.dedicated_db = false; + } + if (devs_source.count(BlueFS::BDEV_WAL)) { + bluefs_layout.dedicated_wal = false; + } + r = bluefs->device_migrate_to_existing(cct, devs_source, id, bluefs_layout); if (r < 0) { derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl; goto shutdown; @@ -6492,9 +6502,12 @@ int BlueStore::migrate_to_new_bluefs_device(const set& devs_source, if (devs_source.count(BlueFS::BDEV_DB) && bluefs_layout.shared_bdev != BlueFS::BDEV_DB) { link_db = path + "/block.db"; + bluefs_layout.shared_bdev = BlueFS::BDEV_DB; + bluefs_layout.dedicated_db = false; } if (devs_source.count(BlueFS::BDEV_WAL)) { link_wal = path + "/block.wal"; + bluefs_layout.dedicated_wal = false; } size_t target_size; @@ -6502,6 +6515,7 @@ int BlueStore::migrate_to_new_bluefs_device(const set& devs_source, if (id == BlueFS::BDEV_NEWWAL) { target_name = "block.wal"; target_size = cct->_conf->bluestore_block_wal_size; + bluefs_layout.dedicated_wal = true; r = bluefs->add_block_device(BlueFS::BDEV_NEWWAL, dev_path, cct->_conf->bdev_enable_discard); @@ -6519,6 +6533,8 @@ int BlueStore::migrate_to_new_bluefs_device(const set& devs_source, } else if (id == BlueFS::BDEV_NEWDB) { target_name = "block.db"; target_size = cct->_conf->bluestore_block_db_size; + bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW; + bluefs_layout.dedicated_db = true; r = bluefs->add_block_device(BlueFS::BDEV_NEWDB, dev_path, cct->_conf->bdev_enable_discard); @@ -6541,7 +6557,7 @@ int BlueStore::migrate_to_new_bluefs_device(const set& devs_source, bluefs->add_block_extent( id, reserved, bluefs->get_block_device_size(id) - reserved); - r = bluefs->device_migrate_to_new(cct, devs_source, id); + r = bluefs->device_migrate_to_new(cct, devs_source, id, bluefs_layout); if (r < 0) { derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl;