From: Zhi Zhang Date: Thu, 6 Jun 2019 03:32:34 +0000 (+0800) Subject: mds: count purge queue items left in journal X-Git-Tag: v15.1.0~2523^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=176c24ef50f26b1d530f3aa5b247b4a64f4a0ff0;p=ceph.git mds: count purge queue items left in journal 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 --- diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index a93c9d721818..882fce548812 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -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); } diff --git a/src/mds/PurgeQueue.h b/src/mds/PurgeQueue.h index 6d915f694060..40b1f67d442a 100644 --- a/src/mds/PurgeQueue.h +++ b/src/mds/PurgeQueue.h @@ -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(); diff --git a/src/osdc/Journaler.h b/src/osdc/Journaler.h index e3cd9e6c508d..4bc5afad78a3 100644 --- a/src/osdc/Journaler.h +++ b/src/osdc/Journaler.h @@ -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)