From: Igor Fedotov Date: Fri, 26 Apr 2024 16:05:10 +0000 (+0300) Subject: os/bluestore: enable async manual compactions X-Git-Tag: v20.0.0~1637^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9865de86bccdc5cee0ed2c835fcf06656af1823e;p=ceph.git os/bluestore: enable async manual compactions Signed-off-by: Igor Fedotov --- diff --git a/src/common/options/global.yaml.in b/src/common/options/global.yaml.in index 52d306e4c11c..440aa3454d52 100644 --- a/src/common/options/global.yaml.in +++ b/src/common/options/global.yaml.in @@ -5030,6 +5030,13 @@ options: This setting is used only when OSD is doing ``--mkfs``. Next runs of OSD retrieve sharding from disk. default: m(3) p(3,0-12) O(3,0-13)=block_cache={type=binned_lru} L=min_write_buffer_number_to_merge=32 P=min_write_buffer_number_to_merge=32 +- name: bluestore_async_db_compaction + type: bool + level: dev + desc: Perform DB compaction requests asynchronously + long_desc: 'How to perform DB compactions triggered either through async socket or + by OSD initialization procedure on start.' + default: true - name: bluestore_qfsck_on_mount type: bool level: dev diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index 28217118609e..12723a8314d3 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -1988,6 +1988,7 @@ int RocksDBStore::split_key(rocksdb::Slice in, string *prefix, string *key) void RocksDBStore::compact() { + dout(2) << __func__ << " starting" << dendl; logger->inc(l_rocksdb_compact); rocksdb::CompactRangeOptions options; db->CompactRange(options, default_cf, nullptr, nullptr); @@ -1999,6 +2000,7 @@ void RocksDBStore::compact() nullptr, nullptr); } } + dout(2) << __func__ << " completed" << dendl; } void RocksDBStore::compact_thread_entry() diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index 3f9535337004..ddf48bfa89a4 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -791,7 +791,7 @@ public: virtual void inject_data_error(const ghobject_t &oid) {} virtual void inject_mdata_error(const ghobject_t &oid) {} - virtual void compact() {} + virtual int compact() { return -ENOTSUP; } virtual bool has_builtin_csum() const { return false; } diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index f8d51cd0e4c6..8ded55be0076 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -11221,6 +11221,22 @@ void BlueStore::inject_bluefs_file(std::string_view dir, std::string_view name, bluefs->close_writer(p_handle); } +int BlueStore::compact() +{ + int r = 0; + ceph_assert(db); + if (cct->_conf.get_val("bluestore_async_db_compaction")) { + dout(1) << __func__ << " starting async.." << dendl; + db->compact_async(); + r = -EINPROGRESS; + } else { + dout(1) << __func__ << " starting sync.." << dendl; + db->compact(); + dout(1) << __func__ << " finished." << dendl; + } + return r; +} + void BlueStore::collect_metadata(map *pm) { dout(10) << __func__ << dendl; diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 2932a59b89b2..ee1577bfa816 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -3379,10 +3379,7 @@ public: std::string_view name, size_t new_size); - void compact() override { - ceph_assert(db); - db->compact(); - } + int compact() override; bool has_builtin_csum() const override { return true; } diff --git a/src/os/kstore/KStore.h b/src/os/kstore/KStore.h index 5b275dd3e011..9a9d413c66a8 100644 --- a/src/os/kstore/KStore.h +++ b/src/os/kstore/KStore.h @@ -580,9 +580,10 @@ public: TrackedOpRef op = TrackedOpRef(), ThreadPool::TPHandle *handle = NULL) override; - void compact () override { + int compact () override { ceph_assert(db); db->compact(); + return 0; } private: diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 85207f173116..cee540115614 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2976,15 +2976,22 @@ will start to track new ops received afterwards."; } else if (prefix == "compact") { dout(1) << "triggering manual compaction" << dendl; auto start = ceph::coarse_mono_clock::now(); - store->compact(); - auto end = ceph::coarse_mono_clock::now(); - double duration = std::chrono::duration(end-start).count(); - dout(1) << "finished manual compaction in " - << duration - << " seconds" << dendl; - f->open_object_section("compact_result"); - f->dump_float("elapsed_time", duration); - f->close_section(); + int r = store->compact(); + if (r == 0) { + auto end = ceph::coarse_mono_clock::now(); + double duration = std::chrono::duration(end-start).count(); + + dout(1) << "finished manual compaction in " + << duration + << " seconds" << dendl; + f->open_object_section("compact_result"); + f->dump_float("elapsed_time", duration); + f->close_section(); + } else if ( r == -EINPROGRESS) { + dout(1) << "manual compaction is being executed asynchronously" << dendl; + } else { + derr << "error starting manual compaction:" << cpp_strerror(r) << dendl; + } } else if (prefix == "get_mapped_pools") { f->open_array_section("mapped_pools"); set poollist = get_mapped_pools(); @@ -3900,7 +3907,7 @@ int OSD::init() dout(2) << "superblock: I am osd." << superblock.whoami << dendl; if (cct->_conf.get_val("osd_compact_on_start")) { - dout(2) << "compacting object store's omap" << dendl; + dout(2) << "compacting object store's DB" << dendl; store->compact(); }