]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: enable async manual compactions
authorIgor Fedotov <ifedotov@suse.com>
Fri, 26 Apr 2024 16:05:10 +0000 (19:05 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Mon, 22 Jul 2024 18:32:55 +0000 (21:32 +0300)
Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
(cherry picked from commit 9865de86bccdc5cee0ed2c835fcf06656af1823e)

src/common/options/global.yaml.in
src/kv/RocksDBStore.cc
src/os/ObjectStore.h
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h
src/os/kstore/KStore.h
src/osd/OSD.cc

index 9bab8af70633b661a849b60cf56cc604c6cc6296..4deb340a6867c98f2b9b9591ba6f776b0fbba463 100644 (file)
@@ -5011,6 +5011,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
index fd2b26f3803e2f5ae5c08098a50aa4e92ee71ebd..1ad5a8c663cb85d4f4845a7adf5f6fb1297d987c 100644 (file)
@@ -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()
index 4c837b84d01074ff33ce8317aeff37e0a3b9cb82..da204824229e0b10f4bcf81c02ecf397e289fb01 100644 (file)
@@ -777,7 +777,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;
   }
index 046f820b53367b323a34ec4bd9735a830a74d43a..b51cb886e7e220beccec657d1e11244827bcb61f 100644 (file)
@@ -10338,6 +10338,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<bool>("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<string,string> *pm)
 {
   dout(10) << __func__ << dendl;
index c3d014dc938048006cc7cc39e8740f3e81780dcb..9f732db0d338895426c3197eb64d266c10a01d92 100644 (file)
@@ -3291,10 +3291,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;
   }
index 9e3c7acd73b428880a6330445879436acd54325b..9863c67052c0f3d524cc9d07c5fd328967e17794 100644 (file)
@@ -573,9 +573,10 @@ public:
     TrackedOpRef op = TrackedOpRef(),
     ThreadPool::TPHandle *handle = NULL) override;
 
-  void compact () override {
+  int compact () override {
     ceph_assert(db);
     db->compact();
+    return 0;
   }
   
 private:
index 515eb60423757ec7dbe3095949f33b1633493704..d2db1f5b35524d27cc42b3ee3a102fd3c0161a08 100644 (file)
@@ -2994,15 +2994,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<double>(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<double>(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<int64_t> poollist = get_mapped_pools();
@@ -3898,7 +3905,7 @@ int OSD::init()
   dout(2) << "superblock: I am osd." << superblock.whoami << dendl;
 
   if (cct->_conf.get_val<bool>("osd_compact_on_start")) {
-    dout(2) << "compacting object store's omap" << dendl;
+    dout(2) << "compacting object store's DB" << dendl;
     store->compact();
   }