]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: drive mdlog trimming via a separate thread
authorVenky Shankar <vshankar@redhat.com>
Tue, 8 Aug 2023 05:48:45 +0000 (01:48 -0400)
committerVenky Shankar <vshankar@redhat.com>
Tue, 30 Jan 2024 05:28:48 +0000 (10:58 +0530)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/common/options/mds.yaml.in
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDSRank.cc

index 08d221835716ed6cf6d16535cacba0ea0b991bcd..77d5fe253d557f0befde7c9f86e0c4a3702d8454 100644 (file)
@@ -1625,3 +1625,13 @@ options:
   - mds_log_max_segments
   flags:
   - runtime
+- name: mds_log_trim_upkeep_interval
+  type: millisecs
+  level: advanced
+  desc: MDS log trimming interval
+  long_desc: Interval in milliseconds to trim MDS logs.
+  default: 1000
+  services:
+  - mds
+  flags:
+  - runtime
index 544ddde8e05ff21965bed3ebc4175d2d5553c8a4..5b1146ccd9d59c82f28d9bdddbe96251159d34e8 100644 (file)
@@ -58,6 +58,7 @@ MDLog::MDLog(MDSRank* m)
   max_events = g_conf().get_val<int64_t>("mds_log_max_events");
   skip_corrupt_events = g_conf().get_val<bool>("mds_log_skip_corrupt_events");
   skip_unbounded_events = g_conf().get_val<bool>("mds_log_skip_unbounded_events");
+  upkeep_thread = std::thread(&MDLog::log_trim_upkeep, this);
 }
 
 MDLog::~MDLog()
@@ -556,6 +557,13 @@ void MDLog::shutdown()
     }
   }
 
+  upkeep_log_trim_shutdown = true;
+  cond.notify_one();
+
+  mds->mds_lock.unlock();
+  upkeep_thread.join();
+  mds->mds_lock.lock();
+
   // Replay thread can be stuck inside e.g. Journaler::wait_for_readable,
   // so we need to shutdown the journaler first.
   if (journaler) {
@@ -606,11 +614,23 @@ void MDLog::try_to_commit_open_file_table(uint64_t last_seq)
   }
 }
 
-void MDLog::trim(int m)
+void MDLog::log_trim_upkeep(void) {
+  dout(10) << dendl;
+
+  std::unique_lock mds_lock(mds->mds_lock);
+  while (!upkeep_log_trim_shutdown.load()) {
+    if (mds->is_active() || mds->is_stopping()) {
+      trim();
+    }
+
+    cond.wait_for(mds_lock, g_conf().get_val<std::chrono::milliseconds>("mds_log_trim_upkeep_interval"));
+  }
+  dout(10) << __func__ << ": finished" << dendl;
+}
+
+void MDLog::trim()
 {
   int max_ev = max_events;
-  if (m >= 0)
-    max_ev = m;
 
   if (mds->mdcache->is_readonly()) {
     dout(10) << "trim, ignoring read-only FS" <<  dendl;
@@ -794,6 +814,7 @@ int MDLog::trim_all()
 
 void MDLog::try_expire(LogSegment *ls, int op_prio)
 {
+  ceph_assert(ceph_mutex_is_locked(mds->mds_lock));
   MDSGatherBuilder gather_bld(g_ceph_context);
   ls->try_to_expire(mds, gather_bld, op_prio);
 
index c12a4b8d5338d349746f40a6f4d9e0a5db081b7c..33eba835c40234779303f81d25e08fb74307b363 100644 (file)
@@ -147,7 +147,6 @@ public:
   }
 
   void trim_expired_segments();
-  void trim(int max=-1);
   int trim_all();
 
   void create(MDSContext *onfinish);  // fresh, empty log! 
@@ -289,6 +288,9 @@ private:
   void _trim_expired_segments();
   void write_head(MDSContext *onfinish);
 
+  void trim();
+  void log_trim_upkeep(void);
+
   bool debug_subtrees;
   std::atomic_uint64_t event_large_threshold; // accessed by submit thread
   uint64_t events_per_segment;
@@ -306,5 +308,11 @@ private:
 
   // log trimming decay counter
   DecayCounter log_trim_counter;
+
+  // log trimming upkeeper thread
+  std::thread upkeep_thread;
+  // guarded by mds_lock
+  std::condition_variable_any cond;
+  std::atomic<bool> upkeep_log_trim_shutdown{false};
 };
 #endif
index 9bbfc0433fa2ec8023c4a9ae8306edec94cd0595..6f8439470a655d7706e3fd3907077c64dd5d0286 100644 (file)
@@ -743,10 +743,6 @@ void MDSRankDispatcher::tick()
   // update average session uptime
   sessionmap.update_average_session_age();
 
-  if (is_active() || is_stopping()) {
-    mdlog->trim();  // NOT during recovery!
-  }
-
   // ...
   if (is_clientreplay() || is_active() || is_stopping()) {
     server->clear_laggy_clients();
@@ -789,7 +785,6 @@ void MDSRankDispatcher::tick()
 
   // shut down?
   if (is_stopping()) {
-    mdlog->trim();
     if (mdcache->shutdown_pass()) {
       uint64_t pq_progress = 0 ;
       uint64_t pq_total = 0;