From: Mykola Golub Date: Thu, 17 Mar 2016 11:24:53 +0000 (+0200) Subject: rbd-mirror: make remote context respect env and argv config params X-Git-Tag: v10.1.0~29^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=21e127bc4c5bd7d05d8d6452b15dbb305267ad4b;p=ceph.git rbd-mirror: make remote context respect env and argv config params Signed-off-by: Mykola Golub --- diff --git a/src/tools/rbd_mirror/Mirror.cc b/src/tools/rbd_mirror/Mirror.cc index 20bd41f8b7d9..c5c38bec36a1 100644 --- a/src/tools/rbd_mirror/Mirror.cc +++ b/src/tools/rbd_mirror/Mirror.cc @@ -27,8 +27,9 @@ using librbd::mirror_peer_t; namespace rbd { namespace mirror { -Mirror::Mirror(CephContext *cct) : +Mirror::Mirror(CephContext *cct, const std::vector &args) : m_cct(cct), + m_args(args), m_lock("rbd::mirror::Mirror"), m_local(new librados::Rados()) { @@ -82,7 +83,8 @@ void Mirror::update_replayers(const map > &peer_configs) const peer_t &peer = kv.first; if (m_replayers.find(peer) == m_replayers.end()) { dout(20) << "starting replayer for " << peer << dendl; - unique_ptr replayer(new Replayer(m_threads, m_local, peer)); + unique_ptr replayer(new Replayer(m_threads, m_local, peer, + m_args)); // TODO: make async, and retry connecting within replayer int r = replayer->init(); if (r < 0) { diff --git a/src/tools/rbd_mirror/Mirror.h b/src/tools/rbd_mirror/Mirror.h index 8408ee362d68..6b6cc97f1be6 100644 --- a/src/tools/rbd_mirror/Mirror.h +++ b/src/tools/rbd_mirror/Mirror.h @@ -29,7 +29,7 @@ struct Threads; */ class Mirror { public: - Mirror(CephContext *cct); + Mirror(CephContext *cct, const std::vector &args); Mirror(const Mirror&) = delete; Mirror& operator=(const Mirror&) = delete; @@ -42,6 +42,7 @@ private: void update_replayers(const map > &peer_configs); CephContext *m_cct; + std::vector m_args; Threads *m_threads = nullptr; Mutex m_lock; Cond m_cond; diff --git a/src/tools/rbd_mirror/Replayer.cc b/src/tools/rbd_mirror/Replayer.cc index f40127b6e893..620a6a848ef5 100644 --- a/src/tools/rbd_mirror/Replayer.cc +++ b/src/tools/rbd_mirror/Replayer.cc @@ -22,10 +22,11 @@ namespace rbd { namespace mirror { Replayer::Replayer(Threads *threads, RadosRef local_cluster, - const peer_t &peer) : + const peer_t &peer, const std::vector &args) : m_threads(threads), m_lock(stringify("rbd::mirror::Replayer ") + stringify(peer)), m_peer(peer), + m_args(args), m_local(local_cluster), m_remote(new librados::Rados), m_replayer_thread(this) @@ -63,6 +64,22 @@ int Replayer::init() return r; } + r = m_remote->conf_parse_env(nullptr); + if (r < 0) { + derr << "could not parse environment for " << m_peer + << " : " << cpp_strerror(r) << dendl; + return r; + } + + if (!m_args.empty()) { + r = m_remote->conf_parse_argv(m_args.size(), &m_args[0]); + if (r < 0) { + derr << "could not parse command line args for " << m_peer + << " : " << cpp_strerror(r) << dendl; + return r; + } + } + r = m_remote->connect(); if (r < 0) { derr << "error connecting to remote cluster " << m_peer diff --git a/src/tools/rbd_mirror/Replayer.h b/src/tools/rbd_mirror/Replayer.h index 44d699e1cbe4..83748b94e747 100644 --- a/src/tools/rbd_mirror/Replayer.h +++ b/src/tools/rbd_mirror/Replayer.h @@ -30,7 +30,8 @@ struct Threads; */ class Replayer { public: - Replayer(Threads *threads, RadosRef local_cluster, const peer_t &peer); + Replayer(Threads *threads, RadosRef local_cluster, const peer_t &peer, + const std::vector &args); ~Replayer(); Replayer(const Replayer&) = delete; Replayer& operator=(const Replayer&) = delete; @@ -51,6 +52,7 @@ private: atomic_t m_stopping; peer_t m_peer; + std::vector m_args; std::string m_client_id; RadosRef m_local, m_remote; std::unique_ptr m_pool_watcher; diff --git a/src/tools/rbd_mirror/main.cc b/src/tools/rbd_mirror/main.cc index a21d57881419..017f5a4b2b4a 100644 --- a/src/tools/rbd_mirror/main.cc +++ b/src/tools/rbd_mirror/main.cc @@ -58,7 +58,10 @@ int main(int argc, const char **argv) register_async_signal_handler_oneshot(SIGINT, handle_signal); register_async_signal_handler_oneshot(SIGTERM, handle_signal); - mirror = new rbd::mirror::Mirror(g_ceph_context); + std::vector cmd_args; + argv_to_vec(argc, argv, cmd_args); + + mirror = new rbd::mirror::Mirror(g_ceph_context, cmd_args); int r = mirror->init(); if (r < 0) { std::cerr << "failed to initialize: " << cpp_strerror(r) << std::endl;