show_cache();
//dump();
return false;
- }
+ }
// done!
dout(2) << "shutdown done." << dendl;
pcb.add_u64(l_mdc_num_strays_delayed, "num_strays_delayed", "Stray dentries delayed");
pcb.add_u64(l_mdc_num_strays_enqueuing, "num_strays_enqueuing", "Stray dentries enqueuing for purge");
- pcb.add_u64(l_mdc_num_strays_purging, "num_strays_purging", "Stray dentries purging");
- pcb.add_u64(l_mdc_num_purge_ops, "num_purge_ops", "Purge operations");
-
pcb.add_u64_counter(l_mdc_strays_created, "strays_created", "Stray dentries created");
pcb.add_u64_counter(l_mdc_strays_enqueued, "strays_enqueued",
- "Stray dentries enqueued for purge", "purg");
+ "Stray dentries enqueued for purge");
pcb.add_u64_counter(l_mdc_strays_reintegrated, "strays_reintegrated", "Stray dentries reintegrated");
pcb.add_u64_counter(l_mdc_strays_migrated, "strays_migrated", "Stray dentries migrated");
+
/* Recovery queue statistics */
pcb.add_u64(l_mdc_num_recovering_processing, "num_recovering_processing", "Files currently being recovered");
pcb.add_u64(l_mdc_num_recovering_enqueued, "num_recovering_enqueued",
// How many stray dentries are currently being enqueued for purge
l_mdc_num_strays_enqueuing,
- // >> TODO populate from PurgeQueue
- // How many stray dentries are currently enqueued for purge
- l_mdc_num_strays_purging,
- // How many purge RADOS ops might currently be in flight?
- l_mdc_num_purge_ops,
- // << TODO
-
// How many dentries have ever been added to stray dir
l_mdc_strays_created,
// How many dentries have been passed on to PurgeQueue
mdlog->create_logger();
server->create_logger();
+ purge_queue.create_logger();
sessionmap.register_perfcounters();
mdcache->register_perfcounters();
}
#include "common/debug.h"
#include "mds/mdstypes.h"
#include "mds/CInode.h"
+#include "mds/MDCache.h"
#include "PurgeQueue.h"
// TODO: when we're deactivating, lift all limits on
// how many OSD ops we're allowed to emit at a time to
// race through the queue as fast as we can.
-// TODO: populate logger here to gather latency stat?
-// ...and a stat for the size of the queue, if we can
-// somehow track that? Could do an initial pass through
-// the whole queue to count the items at startup?
-// TODO: there is absolutely no reason to consume an inode number
-// for this. Shoudl just give objects a string name with a rank
-// suffix, like we do for MDSTables. Requires a little refactor
-// of Journaler.
// TODO: if Objecter has any slow requests, take that as a hint and
// slow down our rate of purging (keep accepting pushes though)
PurgeQueue::PurgeQueue(
{
}
+PurgeQueue::~PurgeQueue()
+{
+ if (logger) {
+ g_ceph_context->get_perfcounters_collection()->remove(logger.get());
+ }
+}
+
+void PurgeQueue::create_logger()
+{
+ PerfCountersBuilder pcb(g_ceph_context,
+ "purge_queue", l_pq_first, l_pq_last);
+ //pcb.add_u64(l_mdc_num_strays_purging, "num_strays_purging", "Stray dentries purging");
+ // pcb.add_u64(l_mdc_num_purge_ops, "num_purge_ops", "Purge operations");
+ pcb.add_u64(l_pq_executing, "pq_executing", "Purge queue tasks in flight");
+ pcb.add_u64_counter(l_pq_executed, "pq_executed", "Purge queue tasks executed");
+
+ logger.reset(pcb.create_perf_counters());
+ g_ceph_context->get_perfcounters_collection()->add(logger.get());
+}
+
void PurgeQueue::init()
{
Mutex::Locker l(lock);
+ assert(logger != nullptr);
+
finisher.start();
timer.init();
}
assert(lock.is_locked_by_me());
in_flight[expire_to] = item;
+ logger->set(l_pq_executing, in_flight.size());
SnapContext nullsnapc;
derr << "Invalid item (action=" << item.action << ") in purge queue, "
"dropping it" << dendl;
in_flight.erase(expire_to);
+ logger->set(l_pq_executing, in_flight.size());
return;
}
assert(gather.has_subs());
<< std::dec << dendl;
in_flight.erase(iter);
+ logger->set(l_pq_executing, in_flight.size());
#if 0
// Release resources
files_purging -= 1;
#endif
+ logger->inc(l_pq_executed);
+
_consume();
}
};
WRITE_CLASS_ENCODER(PurgeItem)
+enum {
+ l_pq_first = 3500,
+ // >> TODO populate from PurgeQueue
+ // How many stray dentries are currently enqueued for purge
+ //l_mdc_num_strays_purging,
+ // How many purge RADOS ops might currently be in flight?
+ //l_mdc_num_purge_ops,
+ // << TODO
+
+ // How many items have been finished by PurgeQueue
+ l_pq_executing,
+ l_pq_executed,
+ l_pq_last
+};
+
/**
* A persistent queue of PurgeItems. This class both writes and reads
* to the queue. There is one of these per MDS rank.
SafeTimer timer;
Filer filer;
Objecter *objecter;
+ std::unique_ptr<PerfCounters> logger;
+
Journaler journaler;
// Map of Journaler offset to PurgeItem
// Dynamic op limit per MDS based on PG count
uint64_t max_purge_ops;
- //PerfCounters *logger;
bool can_consume();
void init();
void shutdown();
+ void create_logger();
+
// Write an empty queue, use this during MDS rank creation
void create(Context *completion);
mds_rank_t rank_,
const int64_t metadata_pool_,
Objecter *objecter_);
- ~PurgeQueue()
- {}
+ ~PurgeQueue();
};