Skip to content

Commit

Permalink
Merge PR ceph#26422 into master
Browse files Browse the repository at this point in the history
* refs/pull/26422/head:
	mds: start to trim cache when mds enters clientreplay state
	mds: avoid evaluating stray dentry multiple times
	mds: simplfy stray manager activation

Reviewed-by: Patrick Donnelly <[email protected]>
  • Loading branch information
batrick committed Feb 21, 2019
2 parents 4f243b7 + 2797a28 commit 3a58b18
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 66 deletions.
30 changes: 9 additions & 21 deletions src/mds/MDCache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -739,14 +739,15 @@ void MDCache::populate_mydir()
}
}

stray_manager.set_num_strays(num_strays);

// okay!
dout(10) << "populate_mydir done" << dendl;
ceph_assert(!open);
open = true;
mds->queue_waiters(waiting_for_open);

stray_manager.set_num_strays(num_strays);
stray_manager.activate();

scan_stray_dir();
}

Expand Down Expand Up @@ -7530,7 +7531,7 @@ void MDCache::dentry_remove_replica(CDentry *dn, mds_rank_t from, set<SimpleLock
gather_locks.insert(&dn->lock);

// Replicated strays might now be elegible for purge
CDentry::linkage_t *dnl = dn->get_linkage();
CDentry::linkage_t *dnl = dn->get_projected_linkage();
if (dnl->is_primary()) {
maybe_eval_stray(dnl->get_inode());
}
Expand Down Expand Up @@ -12894,21 +12895,6 @@ void MDCache::register_perfcounters()
stray_manager.set_logger(logger.get());
}

void MDCache::activate_stray_manager()
{
if (open) {
stray_manager.activate();
} else {
wait_for_open(
new MDSInternalContextWrapper(mds,
new FunctionContext([this](int r){
stray_manager.activate();
})
)
);
}
}

/**
* Call this when putting references to an inode/dentry or
* when attempting to trim it.
Expand All @@ -12935,9 +12921,11 @@ void MDCache::maybe_eval_stray(CInode *in, bool delay) {
return;
}

if (dn->get_projected_linkage()->is_primary() &&
dn->get_dir()->get_inode()->is_stray()) {
stray_manager.eval_stray(dn, delay);
if (dn->get_dir()->get_inode()->is_stray()) {
if (delay)
stray_manager.queue_delayed(dn);
else
stray_manager.eval_stray(dn);
}
}

Expand Down
3 changes: 0 additions & 3 deletions src/mds/MDCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,6 @@ class MDCache {
stray_index = (stray_index+1)%NUM_STRAY;
}

void activate_stray_manager();

/**
* Call this when you know that a CDentry is ready to be passed
* on to StrayManager (i.e. this is a stray you've just created)
Expand Down Expand Up @@ -1083,7 +1081,6 @@ class MDCache {
void scan_stray_dir(dirfrag_t next=dirfrag_t());
StrayManager stray_manager;
friend struct C_MDC_RetryScanStray;
friend class C_IO_MDC_FetchedBacktrace;

// == messages ==
public:
Expand Down
24 changes: 12 additions & 12 deletions src/mds/MDSRank.cc
Original file line number Diff line number Diff line change
Expand Up @@ -730,27 +730,28 @@ void MDSRankDispatcher::tick()
sessionmap.update_average_session_age();

if (is_active() || is_stopping()) {
server->recall_client_state(nullptr, Server::RecallFlags::ENFORCE_MAX);
mdcache->trim();
mdcache->trim_client_leases();
mdcache->check_memory_usage();
mdlog->trim(); // NOT during recovery!
}

// log
if (logger) {
logger->set(l_mds_subtrees, mdcache->num_subtrees());

mdcache->log_stat();
}

// ...
if (is_clientreplay() || is_active() || is_stopping()) {
mdcache->trim_client_leases();
mdcache->trim();
mdcache->check_memory_usage();

server->recall_client_state(nullptr, Server::RecallFlags::ENFORCE_MAX);

server->find_idle_sessions();
server->evict_cap_revoke_non_responders();
locker->tick();
}

// log
if (logger) {
logger->set(l_mds_subtrees, mdcache->num_subtrees());
mdcache->log_stat();
}

if (is_reconnect())
server->reconnect_tick();
if (is_clientreplay())
Expand Down Expand Up @@ -1986,7 +1987,6 @@ void MDSRank::active_start()
mdcache->start_files_to_recover();

mdcache->reissue_all_caps();
mdcache->activate_stray_manager();

finish_contexts(g_ceph_context, waiting_for_active); // kick waiters
}
Expand Down
41 changes: 22 additions & 19 deletions src/mds/StrayManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -338,15 +338,28 @@ void StrayManager::_enqueue(CDentry *dn, bool trunc)
}
}

void StrayManager::queue_delayed(CDentry *dn)
{
if (!started)
return;

if (dn->state_test(CDentry::STATE_EVALUATINGSTRAY))
return;

if (!dn->item_stray.is_on_list()) {
delayed_eval_stray.push_back(&dn->item_stray);
num_strays_delayed++;
logger->set(l_mdc_num_strays_delayed, num_strays_delayed);
}
}

void StrayManager::advance_delayed()
{
if (!started)
return;

for (elist<CDentry*>::iterator p = delayed_eval_stray.begin(); !p.end(); ) {
CDentry *dn = *p;
++p;
while (!delayed_eval_stray.empty()) {
CDentry *dn = delayed_eval_stray.front();
dn->item_stray.remove_myself();
num_strays_delayed--;

Expand Down Expand Up @@ -408,7 +421,7 @@ struct C_MDC_EvalStray : public StrayManagerContext {
}
};

bool StrayManager::_eval_stray(CDentry *dn, bool delay)
bool StrayManager::_eval_stray(CDentry *dn)
{
dout(10) << "eval_stray " << *dn << dendl;
CDentry::linkage_t *dnl = dn->get_projected_linkage();
Expand All @@ -427,17 +440,13 @@ bool StrayManager::_eval_stray(CDentry *dn, bool delay)
// call eval_stray() after purge()
ceph_assert(!dn->state_test(CDentry::STATE_PURGING));

if (!dn->is_auth()) {
if (!dn->is_auth())
return false;
}

if (!started)
delay = true;
return false;

if (dn->item_stray.is_on_list()) {
if (delay)
return false;

dn->item_stray.remove_myself();
num_strays_delayed--;
logger->set(l_mdc_num_strays_delayed, num_strays_delayed);
Expand Down Expand Up @@ -501,14 +510,8 @@ bool StrayManager::_eval_stray(CDentry *dn, bool delay)
dout(20) << " too many dn refs" << dendl;
return false;
}
if (delay) {
if (!dn->item_stray.is_on_list()) {
delayed_eval_stray.push_back(&dn->item_stray);
num_strays_delayed++;
logger->set(l_mdc_num_strays_delayed, num_strays_delayed);
}
// don't purge multiversion inode with snap data
} else if (in->snaprealm && in->snaprealm->has_past_parents() &&
if (in->snaprealm && in->snaprealm->has_past_parents() &&
!in->old_inodes.empty()) {
// A file with snapshots: we will truncate the HEAD revision
// but leave the metadata intact.
Expand Down Expand Up @@ -546,14 +549,14 @@ void StrayManager::activate()
purge_queue.activate();
}

bool StrayManager::eval_stray(CDentry *dn, bool delay)
bool StrayManager::eval_stray(CDentry *dn)
{
// avoid nested eval_stray
if (dn->state_test(CDentry::STATE_EVALUATINGSTRAY))
return false;

dn->state_set(CDentry::STATE_EVALUATINGSTRAY);
bool ret = _eval_stray(dn, delay);
bool ret = _eval_stray(dn);
dn->state_clear(CDentry::STATE_EVALUATINGSTRAY);
return ret;
}
Expand Down
20 changes: 9 additions & 11 deletions src/mds/StrayManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class StrayManager
* @returns true if the dentry will be purged (caller should never
* take more refs after this happens), else false.
*/
bool _eval_stray(CDentry *dn, bool delay=false);
bool _eval_stray(CDentry *dn);

void _eval_stray_remote(CDentry *stray_dn, CDentry *remote_dn);

Expand All @@ -127,21 +127,19 @@ class StrayManager
void set_logger(PerfCounters *l) {logger = l;}
void activate();

bool eval_stray(CDentry *dn, bool delay=false);
bool eval_stray(CDentry *dn);

void set_num_strays(uint64_t num);
uint64_t get_num_strays() const { return num_strays; }

/**
* Where eval_stray was previously invoked with delay=true, call
* eval_stray again for any dentries that were put on the
* delayed_eval_stray list as a result of the original call.
*
* Used so that various places can call eval_stray(delay=true) during
* an operation to identify dentries of interest, and then call
* this function later during trim in order to do the final
* evaluation (and resulting actions) while not in the middle of another
* metadata operation.
* Queue dentry for later evaluation. (evaluate it while not in the
* middle of another metadata operation)
*/
void queue_delayed(CDentry *dn);

/**
* Eval strays in the delayed_eval_stray list
*/
void advance_delayed();

Expand Down

0 comments on commit 3a58b18

Please sign in to comment.