From: Igor Fedotov Date: Wed, 18 Mar 2020 11:51:47 +0000 (+0300) Subject: os/bluestore: avoid bluefs log compaction when doing cold_close X-Git-Tag: v14.2.10~100^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F34611%2Fhead;p=ceph.git os/bluestore: avoid bluefs log compaction when doing cold_close Signed-off-by: Igor Fedotov (cherry picked from commit db6f3f66fcc28c3db2eba01611664676a820cb90) Conflicts: src/os/bluestore/BlueFS.cc src/os/bluestore/BlueFS.h Caused by lack of https://github.com/ceph/ceph/pull/30593 --- diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index b68571e40391..2024ecda723e 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -653,11 +653,11 @@ int BlueFS::mount() return r; } -void BlueFS::umount() +void BlueFS::umount(bool avoid_compact) { dout(1) << __func__ << dendl; - sync_metadata(); + sync_metadata(avoid_compact); _close_writer(log_writer); log_writer = NULL; @@ -2812,7 +2812,7 @@ int BlueFS::_preallocate(FileRef f, uint64_t off, uint64_t len) return 0; } -void BlueFS::sync_metadata() +void BlueFS::sync_metadata(bool avoid_compact) { std::unique_lock l(lock); if (log_t.empty()) { @@ -2825,7 +2825,7 @@ void BlueFS::sync_metadata() dout(10) << __func__ << " done in " << (ceph_clock_now() - start) << dendl; } - if (_should_compact_log()) { + if (!avoid_compact && _should_compact_log()) { if (cct->_conf->bluefs_compact_log_sync) { _compact_log_sync(); } else { diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index f719b3137e37..af080ae03428 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -442,7 +442,7 @@ public: // the super is always stored on bdev 0 int mkfs(uuid_d osd_uuid); int mount(); - void umount(); + void umount(bool avoid_compact = false); int prepare_new_device(int id); int log_dump(); @@ -511,7 +511,7 @@ public: void compact_log(); /// sync any uncommitted state to disk - void sync_metadata(); + void sync_metadata(bool avoid_compact); void set_slow_device_expander(BlueFSDeviceExpander* a) { slow_dev_expander = a; diff --git a/src/os/bluestore/BlueRocksEnv.cc b/src/os/bluestore/BlueRocksEnv.cc index 7f2f8991b9e1..51614c09d2cd 100644 --- a/src/os/bluestore/BlueRocksEnv.cc +++ b/src/os/bluestore/BlueRocksEnv.cc @@ -299,7 +299,7 @@ class BlueRocksDirectory : public rocksdb::Directory { // Fsync directory. Can be called concurrently from multiple threads. rocksdb::Status Fsync() override { // it is sufficient to flush the log. - fs->sync_metadata(); + fs->sync_metadata(false); return rocksdb::Status::OK(); } }; diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2c810171fc68..acf53603d603 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -5189,9 +5189,9 @@ int BlueStore::_open_bluefs(bool create) return r; } -void BlueStore::_close_bluefs() +void BlueStore::_close_bluefs(bool cold_close) { - bluefs->umount(); + bluefs->umount(cold_close); _minimal_close_bluefs(); } @@ -5256,7 +5256,7 @@ int BlueStore::_open_db_and_around(bool read_only) // now open in R/W mode if (!read_only) { - _close_db(); + _close_db(true); r = _open_db(false, false, false); if (r < 0) { @@ -5288,18 +5288,18 @@ int BlueStore::_open_db_and_around(bool read_only) out_fm: _close_fm(); out_db: - _close_db(); + _close_db(read_only); return r; } -void BlueStore::_close_db_and_around() +void BlueStore::_close_db_and_around(bool read_only) { if (bluefs) { - if (out_of_sync_fm.fetch_and(0)) { + if (!read_only && out_of_sync_fm.fetch_and(0)) { _sync_bluefs_and_fm(); } - _close_db(); - while(out_of_sync_fm.fetch_and(0)) { + _close_db(read_only); + while(!read_only && out_of_sync_fm.fetch_and(0)) { // if seen some allocations during close - repeat open_db, sync fm, close dout(0) << __func__ << " syncing FreelistManager" << dendl; int r = _open_db(false, false, false); @@ -5310,7 +5310,7 @@ void BlueStore::_close_db_and_around() break; } _sync_bluefs_and_fm(); - _close_db(); + _close_db(false); } if (!_kv_only) { _close_alloc(); @@ -5319,7 +5319,7 @@ void BlueStore::_close_db_and_around() } else { _close_alloc(); _close_fm(); - _close_db(); + _close_db(read_only); } } @@ -5487,7 +5487,7 @@ int BlueStore::_open_db(bool create, bool to_repair_db, bool read_only) if (!db) { derr << __func__ << " error creating db" << dendl; if (bluefs) { - _close_bluefs(); + _close_bluefs(read_only); } // delete env manually here since we can't depend on db to do this // under this case @@ -5532,7 +5532,7 @@ int BlueStore::_open_db(bool create, bool to_repair_db, bool read_only) } if (r) { derr << __func__ << " erroring opening db: " << err.str() << dendl; - _close_db(); + _close_db(read_only); return -EIO; } dout(1) << __func__ << " opened " << kv_backend @@ -5540,13 +5540,13 @@ int BlueStore::_open_db(bool create, bool to_repair_db, bool read_only) return 0; } -void BlueStore::_close_db() +void BlueStore::_close_db(bool cold_close) { ceph_assert(db); delete db; db = NULL; if (bluefs) { - _close_bluefs(); + _close_bluefs(cold_close); } } @@ -6142,7 +6142,7 @@ int BlueStore::mkfs() out_close_fm: _close_fm(); out_close_db: - _close_db(); + _close_db(false); out_close_bdev: _close_bdev(); out_close_fsid: @@ -6191,7 +6191,7 @@ int BlueStore::_mount_for_bluefs() void BlueStore::_umount_for_bluefs() { - _close_bluefs(); + _close_bluefs(false); _close_fsid(); _close_path(); } @@ -6698,7 +6698,7 @@ int BlueStore::_mount(bool kv_only, bool open_db) out_coll: _flush_cache(); out_db: - _close_db_and_around(); + _close_db_and_around(false); out_bdev: _close_bdev(); out_fsid: @@ -6724,7 +6724,7 @@ int BlueStore::umount() dout(20) << __func__ << " closing" << dendl; } - _close_db_and_around(); + _close_db_and_around(false); _close_bdev(); _close_fsid(); _close_path(); @@ -6776,7 +6776,7 @@ int BlueStore::cold_open() } int BlueStore::cold_close() { - _close_db_and_around(); + _close_db_and_around(true); _close_bdev(); _close_fsid(); _close_path(); @@ -7773,7 +7773,7 @@ out_scan: mempool_thread.shutdown(); _flush_cache(); out_db: - _close_db_and_around(); + _close_db_and_around(false); out_bdev: _close_bdev(); out_fsid: @@ -7866,8 +7866,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) [&](uint64_t pos, mempool_dynamic_bitset &bs) { ceph_assert(pos < bs.size()); bs.set(pos); - } - ); + }); } int r = bluefs->fsck(); if (r < 0) { diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 6f9aec9f8473..64f484efd8d3 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2218,7 +2218,7 @@ private: int _minimal_open_bluefs(bool create); void _minimal_close_bluefs(); int _open_bluefs(bool create); - void _close_bluefs(); + void _close_bluefs(bool cold_close); // Limited (u)mount intended for BlueFS operations only int _mount_for_bluefs(); @@ -2231,7 +2231,7 @@ private: * in the proper order */ int _open_db_and_around(bool read_only); - void _close_db_and_around(); + void _close_db_and_around(bool read_only); // updates legacy bluefs related recs in DB to a state valid for // downgrades from nautilus. @@ -2244,7 +2244,7 @@ private: int _open_db(bool create, bool to_repair_db=false, bool read_only = false); - void _close_db(); + void _close_db(bool read_only); int _open_fm(KeyValueDB::Transaction t); void _close_fm(); int _open_alloc(); diff --git a/src/test/objectstore/test_bluefs.cc b/src/test/objectstore/test_bluefs.cc index 9de5e8d8bdab..4779f9bd915a 100644 --- a/src/test/objectstore/test_bluefs.cc +++ b/src/test/objectstore/test_bluefs.cc @@ -277,7 +277,7 @@ void sync_fs(BlueFS &fs) while (1) { if (writes_done == true) break; - fs.sync_metadata(); + fs.sync_metadata(false); sleep(1); } } @@ -439,10 +439,10 @@ TEST(BlueFS, test_simple_compaction_sync) { string file = "file."; file.append(to_string(j)); fs.unlink(dir, file); - fs.sync_metadata(); + fs.sync_metadata(false); } ASSERT_EQ(0, fs.rmdir(dir)); - fs.sync_metadata(); + fs.sync_metadata(false); } } fs.compact_log(); @@ -492,10 +492,10 @@ TEST(BlueFS, test_simple_compaction_async) { string file = "file."; file.append(to_string(j)); fs.unlink(dir, file); - fs.sync_metadata(); + fs.sync_metadata(false); } ASSERT_EQ(0, fs.rmdir(dir)); - fs.sync_metadata(); + fs.sync_metadata(false); } } fs.compact_log();