bool buffered,
int write_hint = WRITE_LIFE_NOT_SET) = 0;
virtual int flush() = 0;
- virtual bool try_discard(interval_set<uint64_t> &to_release, bool async=true) { return false; }
+ virtual bool try_discard(interval_set<uint64_t> &to_release,
+ bool async=true,
+ bool force=false) { return false; }
virtual void discard_drain() { return; }
virtual void swap_discard_queued(interval_set<uint64_t>& other) { other.clear(); }
// for managing buffered readers/writers
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<void*>(&discard_processing));
discard_processing.clear();
// 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<uint64_t> &to_release, bool async)
+bool KernelDevice::try_discard(interval_set<uint64_t> &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()) {
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;
}
void _aio_thread();
void _discard_thread(uint64_t tid);
bool _queue_discard(interval_set<uint64_t> &to_release);
- bool try_discard(interval_set<uint64_t> &to_release, bool async = true) override;
+ bool try_discard(interval_set<uint64_t> &to_release,
+ bool async = true,
+ bool force = false) override;
int _aio_start();
void _aio_stop();
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
- 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
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
if (trim) {
interval_set<uint64_t> 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
if (r < 0)
goto fail;
- if (create && cct->_conf->bdev_enable_discard) {
+ if (create &&
+ cct->_conf.get_val<bool>("bluestore_discard_on_mkfs")) {
interval_set<uint64_t> 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()) {
struct stat st;
bfn = path + "/block.db";
+ bool trim_db_wal =
+ create && cct->_conf.get_val<bool>("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;
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;