void DaemonStateIndex::insert(DaemonStatePtr dm)
{
RWLock::WLocker l(lock);
+ _insert(dm);
+}
+void DaemonStateIndex::_insert(DaemonStatePtr dm)
+{
if (all.count(dm->key)) {
_erase(dm->key);
}
void DaemonStateIndex::rm(const DaemonKey &key)
{
RWLock::WLocker l(lock);
+ _rm(key);
+}
+
+void DaemonStateIndex::_rm(const DaemonKey &key)
+{
if (all.count(key)) {
_erase(key);
}
PerfCounterTypes types;
void insert(DaemonStatePtr dm);
+ void _insert(DaemonStatePtr dm);
bool exists(const DaemonKey &key) const;
DaemonStatePtr get(const DaemonKey &key);
void rm(const DaemonKey &key);
+ void _rm(const DaemonKey &key);
// Note that these return by value rather than reference to avoid
// callers needing to stay in lock while using result. Callers must
return updating.count(k) > 0;
}
+ void update_metadata(DaemonStatePtr state,
+ const map<string,string>& meta) {
+ // remove and re-insert in case the device metadata changed
+ RWLock::WLocker l(lock);
+ _rm(state->key);
+ {
+ Mutex::Locker l2(state->lock);
+ state->set_metadata(meta);
+ }
+ _insert(state);
+ }
+
/**
* Remove state for all daemons of this type whose names are
* not present in `names_exist`. Use this function when you have
DaemonStatePtr state;
if (daemon_state.exists(key)) {
state = daemon_state.get(key);
- std::lock_guard l(state->lock);
if (key.first == "mds" || key.first == "mgr") {
daemon_meta.erase("name");
} else if (key.first == "osd") {
daemon_meta.erase("id");
}
daemon_meta.erase("hostname");
- state->metadata.clear();
map<string,string> m;
for (const auto &i : daemon_meta) {
m[i.first] = i.second.get_str();
}
- state->set_metadata(m);
+
+ daemon_state.update_metadata(state, m);
} else {
state = std::make_shared<DaemonState>(daemon_state.types);
state->key = key;