From 26c523c3beeb5da7e855be64a053ac9dca7d10e2 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 23 Oct 2017 14:53:30 -0400 Subject: [PATCH] rbd-mirror: strip environment/CLI overrides for remote cluster Fixes: http://tracker.ceph.com/issues/21894 Signed-off-by: Jason Dillaman (cherry picked from commit 70dc22e03a115b130b9c214030d5996276a1634b) --- src/tools/rbd_mirror/PoolReplayer.cc | 36 +++++++++++++++++++++++++--- src/tools/rbd_mirror/PoolReplayer.h | 3 ++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index 8d03e878f16c8..817d3434c3983 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -47,6 +47,9 @@ const std::string SERVICE_DAEMON_LEADER_KEY("leader"); const std::string SERVICE_DAEMON_LOCAL_COUNT_KEY("image_local_count"); const std::string SERVICE_DAEMON_REMOTE_COUNT_KEY("image_remote_count"); +const std::vector UNIQUE_PEER_CONFIG_KEYS { + {"monmap", "mon_host", "mon_dns_srv_name", "key", "keyfile", "keyring"}}; + class PoolReplayerAdminSocketCommand { public: PoolReplayerAdminSocketCommand(PoolReplayer *pool_replayer) @@ -260,7 +263,7 @@ void PoolReplayer::init() dout(20) << "replaying for " << m_peer << dendl; int r = init_rados(g_ceph_context->_conf->cluster, g_ceph_context->_conf->name.to_str(), - "local cluster", &m_local_rados); + "local cluster", &m_local_rados, false); if (r < 0) { m_callout_id = m_service_daemon->add_or_update_callout( m_local_pool_id, m_callout_id, service_daemon::CALLOUT_LEVEL_ERROR, @@ -270,7 +273,7 @@ void PoolReplayer::init() r = init_rados(m_peer.cluster_name, m_peer.client_name, std::string("remote peer ") + stringify(m_peer), - &m_remote_rados); + &m_remote_rados, true); if (r < 0) { m_callout_id = m_service_daemon->add_or_update_callout( m_local_pool_id, m_callout_id, service_daemon::CALLOUT_LEVEL_ERROR, @@ -377,7 +380,8 @@ void PoolReplayer::shut_down() { int PoolReplayer::init_rados(const std::string &cluster_name, const std::string &client_name, const std::string &description, - RadosRef *rados_ref) { + RadosRef *rados_ref, + bool strip_cluster_overrides) { rados_ref->reset(new librados::Rados()); // NOTE: manually bootstrap a CephContext here instead of via @@ -402,6 +406,18 @@ int PoolReplayer::init_rados(const std::string &cluster_name, cct->put(); return r; } + + // preserve cluster-specific config settings before applying environment/cli + // overrides + std::map config_values; + if (strip_cluster_overrides) { + // remote peer connections shouldn't apply cluster-specific + // configuration settings + for (auto& key : UNIQUE_PEER_CONFIG_KEYS) { + config_values[key] = cct->_conf->get_val(key); + } + } + cct->_conf->parse_env(); // librados::Rados::conf_parse_env @@ -427,6 +443,20 @@ int PoolReplayer::init_rados(const std::string &cluster_name, } } + if (strip_cluster_overrides) { + // remote peer connections shouldn't apply cluster-specific + // configuration settings + for (auto& pair : config_values) { + auto value = cct->_conf->get_val(pair.first); + if (pair.second != value) { + dout(0) << "reverting global config option override: " + << pair.first << ": " << value << " -> " << pair.second + << dendl; + cct->_conf->set_val_or_die(pair.first, pair.second); + } + } + } + if (!g_ceph_context->_conf->admin_socket.empty()) { cct->_conf->set_val_or_die("admin_socket", "$run_dir/$name.$pid.$cluster.$cctid.asok"); diff --git a/src/tools/rbd_mirror/PoolReplayer.h b/src/tools/rbd_mirror/PoolReplayer.h index ca693ef748086..49aaee3c4ae76 100644 --- a/src/tools/rbd_mirror/PoolReplayer.h +++ b/src/tools/rbd_mirror/PoolReplayer.h @@ -89,7 +89,8 @@ private: int init_rados(const std::string &cluster_name, const std::string &client_name, - const std::string &description, RadosRef *rados_ref); + const std::string &description, RadosRef *rados_ref, + bool strip_cluster_overrides); void handle_post_acquire_leader(Context *on_finish); void handle_pre_release_leader(Context *on_finish); -- 2.39.5