check_peers();
}
+
+TEST_F(TestClusterWatcher, SiteName) {
+ REQUIRE(!is_librados_test_stub(*m_cluster));
+
+ std::string site_name;
+ librbd::RBD rbd;
+ ASSERT_EQ(0, rbd.mirror_site_name_get(*m_cluster, &site_name));
+
+ m_cluster_watcher->refresh_pools();
+
+ std::lock_guard l{m_lock};
+ ASSERT_EQ(site_name, m_cluster_watcher->get_site_name());
+}
return m_pool_peers;
}
+std::string ClusterWatcher::get_site_name() const {
+ ceph_assert(ceph_mutex_is_locked(m_lock));
+ return m_site_name;
+}
+
void ClusterWatcher::refresh_pools()
{
dout(20) << "enter" << dendl;
PoolPeers pool_peers;
read_pool_peers(&pool_peers);
+ std::string site_name;
+ int r = read_site_name(&site_name);
+
std::lock_guard l{m_lock};
m_pool_peers = pool_peers;
+
+ if (r >= 0) {
+ m_site_name = site_name;
+ }
+
// TODO: perhaps use a workqueue instead, once we get notifications
// about config changes for existing pools
}
}
}
+int ClusterWatcher::read_site_name(std::string* site_name) {
+ dout(10) << dendl;
+
+ librbd::RBD rbd;
+ return rbd.mirror_site_name_get(*m_cluster, site_name);
+}
+
int ClusterWatcher::resolve_peer_config_keys(int64_t pool_id,
const std::string& pool_name,
PeerSpec* peer) {
// Caller controls frequency of calls
void refresh_pools();
const PoolPeers& get_pool_peers() const;
+ std::string get_site_name() const;
private:
typedef std::unordered_map<int64_t, service_daemon::CalloutId> ServicePools;
ServicePools m_service_pools;
PoolPeers m_pool_peers;
+ std::string m_site_name;
void read_pool_peers(PoolPeers *pool_peers);
+ int read_site_name(std::string* site_name);
+
int resolve_peer_config_keys(int64_t pool_id, const std::string& pool_name,
PeerSpec* peer);
};