void ClusterWatcher::shutdown() {
dout(20) << dendl;
std::scoped_lock locker(m_lock);
+ m_stopping = true;
m_monc->sub_unwant("fsmap");
}
std::map<Filesystem, uint64_t> fs_metadata_pools;
{
std::scoped_lock locker(m_lock);
+ if (m_stopping) {
+ return;
+ }
+
// deleted filesystems are considered mirroring disabled
for (auto it = m_filesystem_peers.begin(); it != m_filesystem_peers.end();) {
if (!fsmap.filesystem_exists(it->first.fscid)) {
}
}
- m_monc->sub_got("fsmap", fsmap.get_epoch());
+ std::scoped_lock(m_lock);
+ if (!m_stopping) {
+ m_monc->sub_got("fsmap", fsmap.get_epoch());
+ } // else we have already done a sub_unwant()
}
} // namespace mirror
ServiceDaemon *m_service_daemon;
Listener &m_listener;
+ bool m_stopping = false;
std::map<Filesystem, Peers> m_filesystem_peers;
void handle_fsmap(const cref_t<MFSMap> &m);
{
std::scoped_lock locker(m_lock);
m_thread_pool->stop();
- m_cluster_watcher.reset();
}
}
void Mirror::shutdown() {
dout(20) << dendl;
m_stopping = true;
+ m_cluster_watcher->shutdown();
m_cond.notify_all();
}