From: Igor Fedotov Date: Wed, 9 Jul 2025 16:17:41 +0000 (+0300) Subject: os/bluestore: make full device discard on mkfs a default behavior X-Git-Tag: v21.0.0~256^2~123^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e9d0f939b98260027473af90194dd93abaf3e585;p=ceph.git os/bluestore: make full device discard on mkfs a default behavior Signed-off-by: Igor Fedotov --- diff --git a/src/blk/BlockDevice.h b/src/blk/BlockDevice.h index cb795eaa5e5b..483fc4da26c5 100644 --- a/src/blk/BlockDevice.h +++ b/src/blk/BlockDevice.h @@ -294,7 +294,9 @@ public: bool buffered, int write_hint = WRITE_LIFE_NOT_SET) = 0; virtual int flush() = 0; - virtual bool try_discard(interval_set &to_release, bool async=true) { return false; } + virtual bool try_discard(interval_set &to_release, + bool async=true, + bool force=false) { return false; } virtual void discard_drain() { return; } virtual void swap_discard_queued(interval_set& other) { other.clear(); } // for managing buffered readers/writers diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index db06d3052863..11db95b5f4f6 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -830,10 +830,10 @@ void KernelDevice::_discard_thread(uint64_t tid) discard_running ++; l.unlock(); dout(20) << __func__ << " finishing" << dendl; - logger->inc(l_blk_kernel_device_discard_op, discard_processing.num_intervals()); for (auto p = discard_processing.begin(); p != discard_processing.end(); ++p) { _discard(p.get_start(), p.get_len()); } + logger->inc(l_blk_kernel_device_discard_op, discard_processing.num_intervals()); discard_callback(discard_callback_priv, static_cast(&discard_processing)); discard_processing.clear(); @@ -867,9 +867,11 @@ bool KernelDevice::_queue_discard(interval_set &to_release) // return true only if discard was queued, so caller won't have to do // alloc->release, otherwise return false -bool KernelDevice::try_discard(interval_set &to_release, bool async) +bool KernelDevice::try_discard(interval_set &to_release, + bool async, + bool force) { - if (!support_discard || !cct->_conf->bdev_enable_discard) + if (!support_discard || !(force || cct->_conf->bdev_enable_discard)) return false; if (async && _discard_started()) { @@ -878,6 +880,7 @@ bool KernelDevice::try_discard(interval_set &to_release, bool async) for (auto p = to_release.begin(); p != to_release.end(); ++p) { _discard(p.get_start(), p.get_len()); } + logger->inc(l_blk_kernel_device_discard_op, to_release.num_intervals()); } return false; } diff --git a/src/blk/kernel/KernelDevice.h b/src/blk/kernel/KernelDevice.h index 25aa2710ce3f..149b8b4aa413 100644 --- a/src/blk/kernel/KernelDevice.h +++ b/src/blk/kernel/KernelDevice.h @@ -96,7 +96,9 @@ private: void _aio_thread(); void _discard_thread(uint64_t tid); bool _queue_discard(interval_set &to_release); - bool try_discard(interval_set &to_release, bool async = true) override; + bool try_discard(interval_set &to_release, + bool async = true, + bool force = false) override; int _aio_start(); void _aio_stop(); diff --git a/src/common/options/global.yaml.in b/src/common/options/global.yaml.in index d9de4a8b1c4d..490d5c4edd40 100644 --- a/src/common/options/global.yaml.in +++ b/src/common/options/global.yaml.in @@ -4129,7 +4129,7 @@ options: default: false with_legacy: true - name: bdev_enable_discard - desc: send discards to the block device + desc: enable OSD devices trimming during in runtime type: bool level: advanced default: false @@ -4138,6 +4138,7 @@ options: - runtime see_also: - bdev_async_discard_threads + - bluestore_discard_on_mkfs - name: bdev_async_discard_threads desc: number of discard threads used to issue discards to the device type: uint @@ -5322,6 +5323,16 @@ options: desc: Run deep fsck after mkfs default: false with_legacy: true +- name: bluestore_discard_on_mkfs + desc: trim OSD devices after deployment + type: bool + level: advanced + default: true + with_legacy: false + flags: + - create + see_also: + - bdev_enable_discard - name: bluestore_sync_submit_transaction type: bool level: dev diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 219d2b324b26..61f2950ba481 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -533,7 +533,9 @@ int BlueFS::add_block_device(unsigned id, const string& path, bool trim, if (trim) { interval_set whole_device; whole_device.insert(0, b->get_size()); - b->try_discard(whole_device, false); + dout(5) << __func__ << " trimming device:" << path << dendl; + b->try_discard(whole_device, false, true); + dout(5) << __func__ << " trimmed device:" << path << dendl; } dout(1) << __func__ << " bdev " << id << " path " << path diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index c29287d8394c..e252f92a3a03 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -7072,10 +7072,13 @@ int BlueStore::_open_bdev(bool create) if (r < 0) goto fail; - if (create && cct->_conf->bdev_enable_discard) { + if (create && + cct->_conf.get_val("bluestore_discard_on_mkfs")) { interval_set whole_device; + dout(5) << __func__ << " trimming device:" << p << dendl; whole_device.insert(0, bdev->get_size()); - bdev->try_discard(whole_device, false); + bdev->try_discard(whole_device, false, true); + dout(5) << __func__ << " trimmed device:" << p << dendl; } if (bdev->supported_bdev_label()) { @@ -7561,10 +7564,10 @@ int BlueStore::_minimal_open_bluefs(bool create) struct stat st; bfn = path + "/block.db"; + bool trim_db_wal = + create && cct->_conf.get_val("bluestore_discard_on_mkfs"); if (::stat(bfn.c_str(), &st) == 0) { - r = bluefs->add_block_device( - BlueFS::BDEV_DB, bfn, - create && cct->_conf->bdev_enable_discard); + r = bluefs->add_block_device(BlueFS::BDEV_DB, bfn, trim_db_wal); if (r < 0) { derr << __func__ << " add block device(" << bfn << ") returned: " << cpp_strerror(r) << dendl; @@ -7609,8 +7612,7 @@ int BlueStore::_minimal_open_bluefs(bool create) bfn = path + "/block.wal"; if (::stat(bfn.c_str(), &st) == 0) { - r = bluefs->add_block_device(BlueFS::BDEV_WAL, bfn, - create && cct->_conf->bdev_enable_discard); + r = bluefs->add_block_device(BlueFS::BDEV_WAL, bfn, trim_db_wal); if (r < 0) { derr << __func__ << " add block device(" << bfn << ") returned: " << cpp_strerror(r) << dendl;