configure->stats_period = g_conf->mgr_stats_period;
m->get_connection()->send_message(configure);
+ DaemonStatePtr daemon;
if (daemon_state.exists(key)) {
+ daemon = daemon_state.get(key);
+ }
+ if (daemon) {
dout(20) << "updating existing DaemonState for " << m->daemon_name << dendl;
+ Mutex::Locker l(daemon->lock);
daemon_state.get(key)->perf_counters.clear();
}
if (m->service_daemon) {
- DaemonStatePtr daemon;
- if (daemon_state.exists(key)) {
- daemon = daemon_state.get(key);
- } else {
+ if (!daemon) {
dout(4) << "constructing new DaemonState for " << key << dendl;
daemon = std::make_shared<DaemonState>(daemon_state.types);
daemon->key = key;
}
daemon_state.insert(daemon);
}
+ Mutex::Locker l(daemon->lock);
daemon->service_daemon = true;
daemon->metadata = m->daemon_metadata;
daemon->service_status = m->daemon_status;
// always contains metadata.
}
assert(daemon != nullptr);
+ Mutex::Locker l(daemon->lock);
auto &daemon_counters = daemon->perf_counters;
daemon_counters.update(m);
// if there are any schema updates, notify the python modules
DaemonKey key(p.first, q.first);
assert(daemon_state.exists(key));
auto daemon = daemon_state.get(key);
+ Mutex::Locker l(daemon->lock);
f->dump_stream("status_stamp") << daemon->service_status_stamp;
f->dump_stream("last_beacon") << daemon->last_service_beacon;
f->open_object_section("status");
continue;
}
auto daemon = daemon_state.get(key);
+ Mutex::Locker l(daemon->lock);
if (daemon->last_service_beacon == utime_t()) {
// we must have just restarted; assume they are alive now.
daemon->last_service_beacon = ceph_clock_now();
return result;
}
-DaemonStateCollection DaemonStateIndex::get_by_server(const std::string &hostname) const
+DaemonStateCollection DaemonStateIndex::get_by_server(
+ const std::string &hostname) const
{
Mutex::Locker l(lock);
class DaemonState
{
public:
+ Mutex lock = {"DaemonState::lock"};
+
DaemonKey key;
// The hostname where daemon was last seen running (extracted
DaemonStatePtr state;
if (daemon_state.exists(key)) {
state = daemon_state.get(key);
- // TODO lock state
+ Mutex::Locker l(state->lock);
daemon_meta.erase("name");
daemon_meta.erase("hostname");
state->metadata.clear();
if (daemon_state.exists(k)) {
auto metadata = daemon_state.get(k);
+ Mutex::Locker l(metadata->lock);
auto addr_iter = metadata->metadata.find("front_addr");
if (addr_iter != metadata->metadata.end()) {
const std::string &metadata_addr = addr_iter->second;
bool update = false;
if (daemon_state.exists(k)) {
auto metadata = daemon_state.get(k);
+ Mutex::Locker l(metadata->lock);
if (metadata->metadata.empty() ||
metadata->metadata.count("addr") == 0) {
update = true;
std::string ceph_version;
for (const auto &i : dmc) {
+ Mutex::Locker l(i.second->lock);
const auto &key = i.first;
const std::string &str_type = key.first;
const std::string &svc_name = key.second;
const std::string &svc_id)
{
auto metadata = daemon_state.get(DaemonKey(svc_name, svc_id));
+ Mutex::Locker l(metadata->lock);
PyFormatter f;
f.dump_string("hostname", metadata->hostname);
for (const auto &i : metadata->metadata) {
const std::string &svc_id)
{
auto metadata = daemon_state.get(DaemonKey(svc_name, svc_id));
+ Mutex::Locker l(metadata->lock);
PyFormatter f;
for (const auto &i : metadata->service_status) {
f.dump_string(i.first.c_str(), i.second);
PyFormatter f;
auto dmc = daemon_state.get_by_service("osd");
for (const auto &i : dmc) {
+ Mutex::Locker l(i.second->lock);
f.open_object_section(i.first.second.c_str());
f.dump_string("hostname", i.second->hostname);
for (const auto &j : i.second->metadata) {
auto metadata = daemon_state.get(DaemonKey(svc_name, svc_id));
- // FIXME: this is unsafe, I need to either be inside DaemonStateIndex's
- // lock or put a lock on individual DaemonStates
+ Mutex::Locker l2(metadata->lock);
if (metadata) {
if (metadata->perf_counters.instances.count(path)) {
auto counter_instance = metadata->perf_counters.instances.at(path);
std::ostringstream daemon_name;
auto key = statepair.first;
auto state = statepair.second;
+ Mutex::Locker l(state->lock);
daemon_name << key.first << "." << key.second;
f.open_object_section(daemon_name.str().c_str());