stray_manager.update_op_limit();
}
+void MDCache::handle_conf_change(const struct md_config_t *conf,
+ const std::set <std::string> &changed)
+{
+ assert(mds->mds_lock.is_locked_by_me());
+
+ if (changed.count("mds_max_purge_ops")
+ || changed.count("mds_max_purge_ops_per_pg")) {
+ stray_manager.update_op_limit();
+ }
+}
stray_manager.eval_stray(dn);
}
+ void handle_conf_change(const struct md_config_t *conf,
+ const std::set <std::string> &changed);
+
void maybe_eval_stray(CInode *in, bool delay=false);
bool is_readonly() { return readonly; }
void force_readonly();
"clog_to_syslog",
"clog_to_syslog_facility",
"clog_to_syslog_level",
+ // StrayManager
+ "mds_max_purge_ops",
+ "mds_max_purge_ops_per_pg",
NULL
};
return KEYS;
void MDSDaemon::handle_conf_change(const struct md_config_t *conf,
const std::set <std::string> &changed)
{
- Mutex::Locker l(mds_lock);
+ // We may be called within mds_lock (via `tell`) or outwith the
+ // lock (via admin socket `config set`), so handle either case.
+ const bool initially_locked = mds_lock.is_locked_by_me();
+ if (!initially_locked) {
+ mds_lock.Lock();
+ }
if (changed.count("mds_op_complaint_time") ||
changed.count("mds_op_log_threshold")) {
mds_rank->update_log_config();
}
}
+
if (!g_conf->mds_log_pause && changed.count("mds_log_pause")) {
- if (mds_rank)
+ if (mds_rank) {
mds_rank->mdlog->kick_submitter();
+ }
+ }
+
+ if (mds_rank) {
+ mds_rank->mdcache->handle_conf_change(conf, changed);
+ }
+
+ if (!initially_locked) {
+ mds_lock.Unlock();
}
}
// is consistent (later we take mds_lock within asok callbacks)
set_up_admin_socket();
+ g_conf->add_observer(this);
+
mds_lock.Lock();
if (beacon.get_want_state() == MDSMap::STATE_DNE) {
suicide(); // we could do something more graceful here
// schedule tick
reset_tick();
- g_conf->add_observer(this);
-
mds_lock.Unlock();
return 0;
}
-const char** StrayManager::get_tracked_conf_keys() const
-{
- static const char* KEYS[] = {
- "mds_max_purge_ops",
- "mds_max_purge_ops_per_pg",
- NULL
- };
- return KEYS;
-}
-
-void StrayManager::handle_conf_change(const struct md_config_t *conf,
- const std::set <std::string> &changed)
-{
- if (changed.count("mds_max_purge_ops")
- || changed.count("mds_max_purge_ops_per_pg")) {
- update_op_limit();
- }
-}
-
-
void StrayManager::update_op_limit()
{
const OSDMap *osdmap = mds->objecter->get_osdmap_read();
class CInode;
class CDentry;
-class StrayManager : public md_config_obs_t
+class StrayManager
{
protected:
class QueuedStray {
* Call this whenever one of those operands changes.
*/
void update_op_limit();
-
- /**
- * Subscribe to changes on mds_max_purge_ops
- */
- virtual const char** get_tracked_conf_keys() const;
-
- /**
- * Call update_op_limit if mds_max_purge_ops changes
- */
- virtual void handle_conf_change(const struct md_config_t *conf,
- const std::set <std::string> &changed);
};
#endif // STRAY_MANAGER_H