Skip to content

Commit

Permalink
mds: add extra details for cache drop output
Browse files Browse the repository at this point in the history
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 3bc093f)
  • Loading branch information
batrick committed Mar 4, 2019
1 parent 45918a1 commit 42a64f8
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
16 changes: 14 additions & 2 deletions src/mds/MDSRank.cc
Expand Up @@ -319,7 +319,7 @@ class C_Drop_Cache : public MDSInternalContext {
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);
Expand All @@ -329,6 +329,7 @@ class C_Drop_Cache : public MDSInternalContext {
<< (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();
Expand Down Expand Up @@ -362,6 +363,7 @@ class C_Drop_Cache : public MDSInternalContext {
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
Expand Down Expand Up @@ -406,6 +408,7 @@ class C_Drop_Cache : public MDSInternalContext {
dout(10) << __func__
<< (throttled ? " (throttled)" : "")
<< " trimmed " << count << " caps" << dendl;
dentries_trimmed += count;
if (throttled && count > 0) {
auto timer = new FunctionContext([this](int _) {
trim_cache();
Expand All @@ -419,16 +422,23 @@ class C_Drop_Cache : public MDSInternalContext {
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);
}

Expand All @@ -442,6 +452,8 @@ class C_Drop_Cache : public MDSInternalContext {

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;
Expand Down
3 changes: 1 addition & 2 deletions src/mds/Server.cc
Expand Up @@ -1319,9 +1319,8 @@ std::pair<bool, uint64_t> Server::recall_client_state(MDSGatherBuilder* gather,
if (gather) {
flush_session(session, gather);
}
session->notify_recall_sent(newlim);
caps_recalled += session->notify_recall_sent(newlim);
recall_counter.hit(ceph_clock_now(), recall);
caps_recalled += recall;
}
}

Expand Down
8 changes: 7 additions & 1 deletion src/mds/SessionMap.cc
Expand Up @@ -874,23 +874,28 @@ void Session::notify_cap_release(size_t n_caps)
* 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
* client has respected the recall request. Update only if client has not
* released caps from a previous recall.
*/

uint64_t new_change;
if (recall_limit != new_limit) {
const auto now = clock::now();
recalled_at = now;
assert (new_limit < num_caps); // Behaviour of Server::recall_client_state
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
Expand All @@ -899,6 +904,7 @@ void Session::notify_recall_sent(const size_t new_limit)
* throttle future RECALL messages).
*/
cap_recalled.hit(count);
return new_change;
}

void Session::clear_recalled()
Expand Down
2 changes: 1 addition & 1 deletion src/mds/SessionMap.h
Expand Up @@ -176,7 +176,7 @@ class Session : public RefCountedObject {
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());
}
Expand Down

0 comments on commit 42a64f8

Please sign in to comment.