// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_RBD_MIRROR_CLUSTER_WATCHER_H #define CEPH_RBD_MIRROR_CLUSTER_WATCHER_H #include #include #include #include "common/ceph_context.h" #include "common/Mutex.h" #include "common/Timer.h" #include "include/rados/librados.hpp" #include "tools/rbd_mirror/Types.h" #include "tools/rbd_mirror/service_daemon/Types.h" #include namespace librbd { struct ImageCtx; } namespace rbd { namespace mirror { template class ServiceDaemon; /** * Tracks mirroring configuration for pools in a single * cluster. */ class ClusterWatcher { public: struct PeerSpecCompare { bool operator()(const PeerSpec& lhs, const PeerSpec& rhs) const { return (lhs.uuid < rhs.uuid); } }; typedef std::set Peers; typedef std::map PoolPeers; ClusterWatcher(RadosRef cluster, Mutex &lock, ServiceDaemon* service_daemon); ~ClusterWatcher() = default; ClusterWatcher(const ClusterWatcher&) = delete; ClusterWatcher& operator=(const ClusterWatcher&) = delete; // Caller controls frequency of calls void refresh_pools(); const PoolPeers& get_pool_peers() const; private: typedef std::unordered_map ServicePools; RadosRef m_cluster; Mutex &m_lock; ServiceDaemon* m_service_daemon; ServicePools m_service_pools; PoolPeers m_pool_peers; void read_pool_peers(PoolPeers *pool_peers); int resolve_peer_config_keys(int64_t pool_id, const std::string& pool_name, PeerSpec* peer); }; } // namespace mirror } // namespace rbd #endif // CEPH_RBD_MIRROR_CLUSTER_WATCHER_H