]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: make full device discard on mkfs a default behavior
authorIgor Fedotov <igor.fedotov@croit.io>
Wed, 9 Jul 2025 16:17:41 +0000 (19:17 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Tue, 15 Jul 2025 20:47:33 +0000 (23:47 +0300)
Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
src/blk/BlockDevice.h
src/blk/kernel/KernelDevice.cc
src/blk/kernel/KernelDevice.h
src/common/options/global.yaml.in
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueStore.cc

index cb795eaa5e5b5122e9e01c943b50d6f2ef220f3a..483fc4da26c58464bc041dfe936f9ba167429e44 100644 (file)
@@ -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<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
index db06d3052863416b52e8db58a9337ec269f0856a..11db95b5f4f64cf11e9c8c0499f3f6990a81f08d 100644 (file)
@@ -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<void*>(&discard_processing));
       discard_processing.clear();
@@ -867,9 +867,11 @@ bool KernelDevice::_queue_discard(interval_set<uint64_t> &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<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()) {
@@ -878,6 +880,7 @@ bool KernelDevice::try_discard(interval_set<uint64_t> &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;
 }
index 25aa2710ce3f7ecaba0900521197f062a0f61ea0..149b8b4aa4130e08ebdccc4d77adbdddd5ea0850 100644 (file)
@@ -96,7 +96,9 @@ private:
   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();
index d9de4a8b1c4db431b7c1bb7980e6950e93201dab..490d5c4edd40bdfc4588aedc824a627ef3d7efe6 100644 (file)
@@ -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
index 219d2b324b262c4214a11196f214dd81a8d4eb54..61f2950ba4811bf9223da71ab44ec004181fa24d 100644 (file)
@@ -533,7 +533,9 @@ int BlueFS::add_block_device(unsigned id, const string& path, bool trim,
   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
index c29287d8394ce99d63703d04558e8a0c8c455e9d..e252f92a3a03c0a835517a25711dcb78ccd1f39a 100644 (file)
@@ -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<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()) {
@@ -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<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;
@@ -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;