]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: make remote context respect env and argv config params
authorMykola Golub <mgolub@mirantis.com>
Thu, 17 Mar 2016 11:24:53 +0000 (13:24 +0200)
committerMykola Golub <mgolub@mirantis.com>
Thu, 17 Mar 2016 11:24:53 +0000 (13:24 +0200)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/tools/rbd_mirror/Mirror.cc
src/tools/rbd_mirror/Mirror.h
src/tools/rbd_mirror/Replayer.cc
src/tools/rbd_mirror/Replayer.h
src/tools/rbd_mirror/main.cc

index 20bd41f8b7d92f164e0a49cf7259b88811f59fd0..c5c38bec36a1d12bb89951ac8da40742075bbfbb 100644 (file)
@@ -27,8 +27,9 @@ using librbd::mirror_peer_t;
 namespace rbd {
 namespace mirror {
 
-Mirror::Mirror(CephContext *cct) :
+Mirror::Mirror(CephContext *cct, const std::vector<const char*> &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_t, set<int64_t> > &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> replayer(new Replayer(m_threads, m_local, peer));
+      unique_ptr<Replayer> 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) {
index 8408ee362d689e5ffc3e78e198ebf0071daba019..6b6cc97f1be6bc37df6165bbe3fb291b7230bc34 100644 (file)
@@ -29,7 +29,7 @@ struct Threads;
  */
 class Mirror {
 public:
-  Mirror(CephContext *cct);
+  Mirror(CephContext *cct, const std::vector<const char*> &args);
   Mirror(const Mirror&) = delete;
   Mirror& operator=(const Mirror&) = delete;
 
@@ -42,6 +42,7 @@ private:
   void update_replayers(const map<peer_t, set<int64_t> > &peer_configs);
 
   CephContext *m_cct;
+  std::vector<const char*> m_args;
   Threads *m_threads = nullptr;
   Mutex m_lock;
   Cond m_cond;
index f40127b6e8932435578c5ee6b33aeb2fd179b058..620a6a848ef554bf1551df29409ed6d9a7eab809 100644 (file)
@@ -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<const char*> &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
index 44d699e1cbe4112daa2b495004b12642d0bfd163..83748b94e747da5de2e8b235368b2580db222c32 100644 (file)
@@ -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<const char*> &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<const char*> m_args;
   std::string m_client_id;
   RadosRef m_local, m_remote;
   std::unique_ptr<PoolWatcher> m_pool_watcher;
index a21d5788141901bbd754ace28cf3bdd8b6a0ef34..017f5a4b2b4a912a4735588769a53a5fc7895dbd 100644 (file)
@@ -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<const char*> 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;