]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: count purge queue items left in journal 28376/head
authorZhi Zhang <willzzhang@tencent.com>
Thu, 6 Jun 2019 03:32:34 +0000 (11:32 +0800)
committerZhi Zhang <willzzhang@tencent.com>
Thu, 6 Jun 2019 03:32:34 +0000 (11:32 +0800)
MDS purge queue didn't have a perf counter to record how many items
still left in journal. Even when MDS restarted, there was no any hint to
know how many inodes haven't been really deleted from disks.

Fixes: http://tracker.ceph.com/issues/40121
Signed-off-by: Zhi Zhang <zhangz.david@outlook.com>
src/mds/PurgeQueue.cc
src/mds/PurgeQueue.h
src/osdc/Journaler.h

index a93c9d7218185b40746ecbd8e636b197709b7f74..882fce5488129c30ea58d4220796b92464b6fa69 100644 (file)
@@ -122,6 +122,7 @@ void PurgeQueue::create_logger()
   pcb.set_prio_default(PerfCountersBuilder::PRIO_USEFUL);
   pcb.add_u64(l_pq_executing_ops, "pq_executing_ops", "Purge queue ops in flight");
   pcb.add_u64(l_pq_executing, "pq_executing", "Purge queue tasks in flight");
+  pcb.add_u64(l_pq_item_in_journal, "pq_item_in_journal", "Purge item left in journal");
 
   logger.reset(pcb.create_perf_counters());
   g_ceph_context->get_perfcounters_collection()->add(logger.get());
@@ -141,6 +142,16 @@ void PurgeQueue::activate()
 {
   std::lock_guard l(lock);
 
+  {
+    PurgeItem item;
+    bufferlist bl;
+
+    // calculate purge item serialized size stored in journal
+    // used to count how many items still left in journal later
+    ::encode(item, bl);
+    purge_item_journal_size = bl.length() + journaler.get_journal_envelope_size(); 
+  }
+
   if (readonly) {
     dout(10) << "skipping activate: PurgeQueue is readonly" << dendl;
     return;
@@ -612,6 +623,17 @@ void PurgeQueue::_execute_item_complete(
   logger->set(l_pq_executing, in_flight.size());
   dout(10) << "in_flight.size() now " << in_flight.size() << dendl;
 
+  uint64_t write_pos = journaler.get_write_pos(); 
+  uint64_t read_pos = journaler.get_read_pos(); 
+  uint64_t expire_pos = journaler.get_expire_pos(); 
+  uint64_t item_num = (write_pos - (in_flight.size() ? expire_pos : read_pos)) 
+                     / purge_item_journal_size;
+  dout(10) << "left purge items in journal: " << item_num 
+    << " (purge_item_journal_size/write_pos/read_pos/expire_pos) now at " 
+    << "(" << purge_item_journal_size << "/" << write_pos << "/" << read_pos 
+    << "/" << expire_pos << ")" << dendl;
+
+  logger->set(l_pq_item_in_journal, item_num);
   logger->inc(l_pq_executed);
 }
 
index 6d915f6940603104ec0c32f2460d4273aa4ec2fe..40b1f67d442a49fb8912858d5ff7ad56f749b5ab 100644 (file)
@@ -89,6 +89,7 @@ enum {
   l_pq_executing_ops,
   l_pq_executing,
   l_pq_executed,
+  l_pq_item_in_journal,
   l_pq_last
 };
 
@@ -167,6 +168,8 @@ protected:
 
   void _go_readonly(int r);
 
+  size_t purge_item_journal_size;
+
 public:
   void init();
   void activate();
index e3cd9e6c508d38b9ce004c1cb1ca060eed02ff3e..4bc5afad78a303437037d0110ba534712db68bb9 100644 (file)
@@ -534,6 +534,9 @@ public:
   uint64_t get_read_pos() const { return read_pos; }
   uint64_t get_expire_pos() const { return expire_pos; }
   uint64_t get_trimmed_pos() const { return trimmed_pos; }
+  size_t get_journal_envelope_size() const { 
+    return journal_stream.get_envelope_size(); 
+  }
 };
 WRITE_CLASS_ENCODER(Journaler::Header)