bal_fragment_interval = g_conf().get_val<int64_t>("mds_bal_fragment_interval");
}
-void MDBalancer::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map)
+void MDBalancer::handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map)
{
if (changed.count("mds_bal_fragment_dirs"))
bal_fragment_dirs = g_conf().get_val<bool>("mds_bal_fragment_dirs");
MDBalancer(MDSRank *m, Messenger *msgr, MonClient *monc);
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map);
+ void handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map);
int proc_message(const cref_t<Message> &m);
}
}
-void MDCache::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mdsmap)
+void MDCache::handle_conf_change(const std::set<std::string>& changed, const MDSMap& mdsmap)
{
if (changed.count("mds_cache_size"))
cache_inode_limit = g_conf().get_val<int64_t>("mds_cache_size");
trim_counter = DecayCounter(g_conf().get_val<double>("mds_cache_trim_decay_rate"));
}
- migrator->handle_conf_change(conf, changed, mdsmap);
- mds->balancer->handle_conf_change(conf, changed, mdsmap);
+ migrator->handle_conf_change(changed, mdsmap);
+ mds->balancer->handle_conf_change(changed, mdsmap);
}
void MDCache::log_stat()
public:
explicit MDCache(MDSRank *m, PurgeQueue &purge_queue_);
~MDCache();
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map);
+ void handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map);
// debug
void log_stat();
asok_hook = NULL;
}
-const char** MDSDaemon::get_tracked_conf_keys() const
-{
- static const char* KEYS[] = {
- "mds_op_complaint_time", "mds_op_log_threshold",
- "mds_op_history_size", "mds_op_history_duration",
- "mds_enable_op_tracker",
- "mds_log_pause",
- // clog & admin clog
- "clog_to_monitors",
- "clog_to_syslog",
- "clog_to_syslog_facility",
- "clog_to_syslog_level",
- "clog_to_graylog",
- "clog_to_graylog_host",
- "clog_to_graylog_port",
- // MDCache
- "mds_cache_size",
- "mds_cache_memory_limit",
- "mds_cache_reservation",
- "mds_health_cache_threshold",
- "mds_cache_mid",
- "mds_dump_cache_threshold_formatter",
- "mds_cache_trim_decay_rate",
- "mds_dump_cache_threshold_file",
- // MDBalancer
- "mds_bal_fragment_dirs",
- "mds_bal_fragment_interval",
- // PurgeQueue
- "mds_max_purge_ops",
- "mds_max_purge_ops_per_pg",
- "mds_max_purge_files",
- // Migrator
- "mds_max_export_size",
- "mds_inject_migrator_session_race",
- "host",
- "fsid",
- "mds_cap_revoke_eviction_timeout",
- // SessionMap
- "mds_request_load_average_decay_rate",
- "mds_recall_max_decay_rate",
- NULL
- };
- return KEYS;
-}
-
-void MDSDaemon::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed)
-{
- // 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")) {
- if (mds_rank) {
- mds_rank->op_tracker.set_complaint_and_threshold(conf->mds_op_complaint_time,
- conf->mds_op_log_threshold);
- }
- }
- if (changed.count("mds_op_history_size") ||
- changed.count("mds_op_history_duration")) {
- if (mds_rank) {
- mds_rank->op_tracker.set_history_size_and_duration(conf->mds_op_history_size,
- conf->mds_op_history_duration);
- }
- }
- if (changed.count("mds_enable_op_tracker")) {
- if (mds_rank) {
- mds_rank->op_tracker.set_tracking(conf->mds_enable_op_tracker);
- }
- }
- if (changed.count("clog_to_monitors") ||
- changed.count("clog_to_syslog") ||
- changed.count("clog_to_syslog_level") ||
- changed.count("clog_to_syslog_facility") ||
- changed.count("clog_to_graylog") ||
- changed.count("clog_to_graylog_host") ||
- changed.count("clog_to_graylog_port") ||
- changed.count("host") ||
- changed.count("fsid")) {
- if (mds_rank) {
- mds_rank->update_log_config();
- }
- }
-
- if (!g_conf()->mds_log_pause && changed.count("mds_log_pause")) {
- if (mds_rank) {
- mds_rank->mdlog->kick_submitter();
- }
- }
-
- if (mds_rank) {
- mds_rank->handle_conf_change(conf, changed);
- }
-
- if (!initially_locked) {
- mds_lock.Unlock();
- }
-}
-
-
int MDSDaemon::init()
{
dout(10) << sizeof(MDSCacheObject) << "\tMDSCacheObject" << dendl;
// Set up admin socket before taking mds_lock, so that ordering
// 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
tick_event = 0;
}
- //because add_observer is called after set_up_admin_socket
- //so we can use asok_hook to avoid assert in the remove_observer
- if (asok_hook != NULL) {
- mds_lock.Unlock();
- g_conf().remove_observer(this);
- mds_lock.Lock();
- }
-
clean_up_admin_socket();
// Inform MDS we are going away, then shut down beacon
class Messenger;
class MonClient;
-class MDSDaemon : public Dispatcher, public md_config_obs_t {
+class MDSDaemon : public Dispatcher {
public:
/* Global MDS lock: every time someone takes this, they must
* also check the `stopping` flag. If stopping is true, you
* such that deleting xlists doesn't assert.
*/
bool is_clean_shutdown();
-
- // config observer bits
- const char** get_tracked_conf_keys() const override;
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed) override;
protected:
// tick and other timer fun
Context *tick_event = nullptr;
dout(1) << __func__ << ": shutting down rank " << whoami << dendl;
+ g_conf().remove_observer(this);
+
timer.shutdown();
// MDLog has to shut down before the finisher, because some of its
Context *suicide_hook_)
: MDSRank(whoami_, mds_lock_, clog_, timer_, beacon_, mdsmap_,
msgr, monc_, respawn_hook_, suicide_hook_)
-{}
+{
+ g_conf().add_observer(this);
+}
bool MDSRankDispatcher::handle_command(
const cmdmap_t &cmdmap,
return objecter->with_osdmap(std::mem_fn(&OSDMap::get_epoch));
}
+const char** MDSRankDispatcher::get_tracked_conf_keys() const
+{
+ static const char* KEYS[] = {
+ "mds_op_complaint_time", "mds_op_log_threshold",
+ "mds_op_history_size", "mds_op_history_duration",
+ "mds_enable_op_tracker",
+ "mds_log_pause",
+ // clog & admin clog
+ "clog_to_monitors",
+ "clog_to_syslog",
+ "clog_to_syslog_facility",
+ "clog_to_syslog_level",
+ "clog_to_graylog",
+ "clog_to_graylog_host",
+ "clog_to_graylog_port",
+ // MDCache
+ "mds_cache_size",
+ "mds_cache_memory_limit",
+ "mds_cache_reservation",
+ "mds_health_cache_threshold",
+ "mds_cache_mid",
+ "mds_dump_cache_threshold_formatter",
+ "mds_cache_trim_decay_rate",
+ "mds_dump_cache_threshold_file",
+ // MDBalancer
+ "mds_bal_fragment_dirs",
+ "mds_bal_fragment_interval",
+ // PurgeQueue
+ "mds_max_purge_ops",
+ "mds_max_purge_ops_per_pg",
+ "mds_max_purge_files",
+ // Migrator
+ "mds_max_export_size",
+ "mds_inject_migrator_session_race",
+ "host",
+ "fsid",
+ "mds_cap_revoke_eviction_timeout",
+ // SessionMap
+ "mds_request_load_average_decay_rate",
+ "mds_recall_max_decay_rate",
+ NULL
+ };
+ return KEYS;
+}
+
+void MDSRankDispatcher::handle_conf_change(const ConfigProxy& conf, const std::set<std::string>& changed)
+{
+ // XXX with or without mds_lock!
+
+ if (changed.count("mds_op_complaint_time") || changed.count("mds_op_log_threshold")) {
+ op_tracker.set_complaint_and_threshold(conf->mds_op_complaint_time, conf->mds_op_log_threshold);
+ }
+ if (changed.count("mds_op_history_size") || changed.count("mds_op_history_duration")) {
+ op_tracker.set_history_size_and_duration(conf->mds_op_history_size, conf->mds_op_history_duration);
+ }
+ if (changed.count("mds_enable_op_tracker")) {
+ op_tracker.set_tracking(conf->mds_enable_op_tracker);
+ }
+ if (changed.count("clog_to_monitors") ||
+ changed.count("clog_to_syslog") ||
+ changed.count("clog_to_syslog_level") ||
+ changed.count("clog_to_syslog_facility") ||
+ changed.count("clog_to_graylog") ||
+ changed.count("clog_to_graylog_host") ||
+ changed.count("clog_to_graylog_port") ||
+ changed.count("host") ||
+ changed.count("fsid")) {
+ update_log_config();
+ }
+
+ finisher->queue(new FunctionContext([this, changed](int r) {
+ std::scoped_lock lock(mds_lock);
+
+ if (changed.count("mds_log_pause") && !g_conf()->mds_log_pause) {
+ mdlog->kick_submitter();
+ }
+ sessionmap.handle_conf_change(changed);
+ server->handle_conf_change(changed);
+ mdcache->handle_conf_change(changed, *mdsmap);
+ purge_queue.handle_conf_change(changed, *mdsmap);
+ }));
+}
void handle_write_error(int err);
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed)
- {
- sessionmap.handle_conf_change(conf, changed);
- server->handle_conf_change(conf, changed);
- mdcache->handle_conf_change(conf, changed, *mdsmap);
- purge_queue.handle_conf_change(conf, changed, *mdsmap);
- }
-
void update_mlogger();
protected:
// Flag to indicate we entered shutdown: anyone seeing this to be true
void create_logger();
public:
-
void queue_waiter(MDSContext *c) {
finished_queue.push_back(c);
progress_thread.signal();
* the service/dispatcher stuff like init/shutdown that subsystems should
* never touch.
*/
-class MDSRankDispatcher : public MDSRank
+class MDSRankDispatcher : public MDSRank, public md_config_obs_t
{
public:
void init();
void handle_osd_map();
void update_log_config();
+ const char** get_tracked_conf_keys() const final;
+ void handle_conf_change(const ConfigProxy& conf, const std::set<std::string>& changed) override;
+
bool handle_command(
const cmdmap_t &cmdmap,
const cref_t<MCommand> &m,
inject_session_race = g_conf().get_val<bool>("mds_inject_migrator_session_race");
}
-void Migrator::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map)
+void Migrator::handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map)
{
if (changed.count("mds_max_export_size"))
max_export_size = g_conf().get_val<Option::size_t>("mds_max_export_size");
if (changed.count("mds_inject_migrator_session_race")) {
- inject_session_race = conf.get_val<bool>("mds_inject_migrator_session_race");
+ inject_session_race = g_conf().get_val<bool>("mds_inject_migrator_session_race");
dout(0) << "mds_inject_migrator_session_race is " << inject_session_race << dendl;
}
}
// -- cons --
Migrator(MDSRank *m, MDCache *c);
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map);
+ void handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map);
protected:
struct export_base_t {
}
}
-void PurgeQueue::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map)
+void PurgeQueue::handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map)
{
if (changed.count("mds_max_purge_ops")
|| changed.count("mds_max_purge_ops_per_pg")) {
// We might have gone from zero to a finite limit, so
// might need to kick off consume.
dout(4) << "maybe start work again (max_purge_files="
- << conf->mds_max_purge_files << dendl;
+ << g_conf()->mds_max_purge_files << dendl;
finisher.queue(new FunctionContext([this](int r){
std::lock_guard l(lock);
_consume();
void update_op_limit(const MDSMap &mds_map);
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed,
- const MDSMap &mds_map);
+ void handle_conf_change(const std::set<std::string>& changed, const MDSMap& mds_map);
PurgeQueue(
CephContext *cct_,
}
}
-void Server::handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed) {
+void Server::handle_conf_change(const std::set<std::string>& changed) {
if (changed.count("mds_cap_revoke_eviction_timeout")) {
cap_revoke_eviction_timeout = g_conf().get_val<double>("mds_cap_revoke_eviction_timeout");
dout(20) << __func__ << " cap revoke eviction timeout changed to "
bool finish_mdr);
void evict_cap_revoke_non_responders();
- void handle_conf_change(const ConfigProxy& conf,
- const std::set <std::string> &changed);
+ void handle_conf_change(const std::set<std::string>& changed);
private:
void reply_client_request(MDRequestRef& mdr, const ref_t<MClientReply> &reply);
session->hit_session();
}
-void SessionMap::handle_conf_change(const ConfigProxy &conf,
- const std::set <std::string> &changed)
+void SessionMap::handle_conf_change(const std::set<std::string>& changed)
{
auto apply_to_open_sessions = [this](auto f) {
if (auto it = by_state.find(Session::STATE_OPEN); it != by_state.end()) {
public:
void hit_session(Session *session);
- void handle_conf_change(const ConfigProxy &conf,
- const std::set <std::string> &changed);
+ void handle_conf_change(const std::set <std::string> &changed);
};
std::ostream& operator<<(std::ostream &out, const Session &s);