void recall_client_state() {
dout(20) << __func__ << dendl;
auto now = mono_clock::now();
- auto duration = std::chrono::duration<double>(recall_start-now).count();
+ auto duration = std::chrono::duration<double>(now-recall_start).count();
MDSGatherBuilder *gather = new MDSGatherBuilder(g_ceph_context);
auto result = server->recall_client_state(gather, Server::RecallFlags::STEADY);
<< (throttled ? " (throttled)" : "")
<< " recalled " << count << " caps" << dendl;
+ caps_recalled += count;
if ((throttled || count > 0) && (recall_timeout == 0 || duration < recall_timeout)) {
auto timer = new FunctionContext([this](int _) {
recall_client_state();
f->open_object_section("client_recall");
f->dump_int("return_code", r);
f->dump_string("message", cpp_strerror(r));
+ f->dump_int("recalled", caps_recalled);
f->close_section();
// we can still continue after recall timeout
dout(10) << __func__
<< (throttled ? " (throttled)" : "")
<< " trimmed " << count << " caps" << dendl;
+ dentries_trimmed += count;
if (throttled && count > 0) {
auto timer = new FunctionContext([this](int _) {
trim_cache();
void cache_status() {
dout(20) << __func__ << dendl;
+ f->open_object_section("trim_cache");
+ f->dump_int("trimmed", dentries_trimmed);
+ f->close_section();
+
// cache status section
mdcache->cache_status(f);
- f->close_section();
complete(0);
}
void finish(int r) override {
dout(20) << __func__ << ": r=" << r << dendl;
+ auto d = std::chrono::duration<double>(mono_clock::now()-recall_start);
+ f->dump_float("duration", d.count());
+
+ f->close_section();
on_finish->complete(r);
}
int retval = 0;
std::stringstream ss;
+ uint64_t caps_recalled = 0;
+ uint64_t dentries_trimmed = 0;
// so as to use dout
mds_rank_t whoami;
* in order to generate health metrics if the session doesn't see
* a commensurate number of calls to ::notify_cap_release
*/
-void Session::notify_recall_sent(const size_t new_limit)
+uint64_t Session::notify_recall_sent(const size_t new_limit)
{
const auto num_caps = caps.size();
+ ceph_assert(new_limit < num_caps);
const auto count = num_caps-new_limit;
/* Entering recall phase, set up counters so we can later judge whether the
* released caps from a previous recall.
*/
+ uint64_t new_change;
if (recall_limit != new_limit) {
const auto now = clock::now();
recalled_at = now;
recall_count = count;
recall_release_count = 0;
recall_limit = new_limit;
+ new_change = count;
+ } else {
+ new_change = 0; /* no change! */
}
/* Always hit the session counter as a RECALL message is still sent to the
* throttle future RECALL messages).
*/
cap_recalled.hit(count);
+ return new_change;
}
void Session::clear_recalled()
interval_set<inodeno_t> pending_prealloc_inos; // journaling prealloc, will be added to prealloc_inos
void notify_cap_release(size_t n_caps);
- void notify_recall_sent(const size_t new_limit);
+ uint64_t notify_recall_sent(const size_t new_limit);
auto cap_recalled_counter() const {
return cap_recalled.get(ceph_clock_now());
}