]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: local pool id no longer stored in client registration
authorJason Dillaman <dillaman@redhat.com>
Thu, 25 Feb 2016 21:06:44 +0000 (16:06 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 8 Mar 2016 14:03:43 +0000 (09:03 -0500)
The remote pool name should match the remote pool name.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/image_replay.cc
src/test/rbd_mirror/test_ImageReplayer.cc
src/tools/rbd_mirror/ImageReplayer.cc
src/tools/rbd_mirror/ImageReplayer.h
src/tools/rbd_mirror/Replayer.cc

index cb175f8394b396258030952dac507b1bf6ec51f7..e23f057996a98c9b89f73c1d90f70074b0fa531b 100644 (file)
@@ -104,6 +104,7 @@ int main(int argc, const char **argv)
 
   rbd::mirror::ImageReplayer::BootstrapParams bootstap_params(local_pool_name,
                                                              image_name);
+  int64_t local_pool_id;
   int64_t remote_pool_id;
   std::string remote_image_id;
 
@@ -141,6 +142,14 @@ int main(int argc, const char **argv)
     goto cleanup;
   }
 
+  r = local->pool_lookup(local_pool_name.c_str());
+  if (r < 0) {
+    derr << "error finding local pool " << local_pool_name
+        << ": " << cpp_strerror(r) << dendl;
+    goto cleanup;
+  }
+  local_pool_id = r;
+
   r = remote->init_with_context(g_ceph_context);
   if (r < 0) {
     derr << "could not initialize rados handle" << dendl;
@@ -171,7 +180,8 @@ int main(int argc, const char **argv)
   dout(5) << "starting replay" << dendl;
 
   replayer = new rbd::mirror::ImageReplayer(local, remote, client_id,
-                                           remote_pool_id, remote_image_id);
+                                            local_pool_id, remote_pool_id,
+                                            remote_image_id);
 
   r = replayer->start(&bootstap_params);
   if (r < 0) {
index 80f9505e29413064312e13e6295e73e55838b07e..56172992e0b14402ef8ab9d501014fa41efdb651 100644 (file)
@@ -101,7 +101,7 @@ public:
     m_replayer = new rbd::mirror::ImageReplayer(
       rbd::mirror::RadosRef(new librados::Rados(m_local_ioctx)),
       rbd::mirror::RadosRef(new librados::Rados(m_remote_ioctx)),
-      m_client_id, remote_pool_id, m_remote_image_id);
+      m_client_id, m_local_ioctx.get_id(), remote_pool_id, m_remote_image_id);
 
     bootstrap();
   }
index 04e135f098c6b29224efebc42cae58c3458489ab..d3cd665f09161c79df11d7b696d8cb9700b661ba 100644 (file)
@@ -160,13 +160,14 @@ private:
 
 ImageReplayer::ImageReplayer(RadosRef local, RadosRef remote,
                             const std::string &client_id,
+                             int64_t local_pool_id,
                             int64_t remote_pool_id,
                             const std::string &remote_image_id) :
   m_local(local),
   m_remote(remote),
   m_client_id(client_id),
   m_remote_pool_id(remote_pool_id),
-  m_local_pool_id(-1),
+  m_local_pool_id(local_pool_id),
   m_remote_image_id(remote_image_id),
   m_lock("rbd::mirror::ImageReplayer " + stringify(remote_pool_id) + " " +
         remote_image_id),
@@ -521,9 +522,13 @@ int ImageReplayer::get_registered_client_status(bool *registered)
       }
       librbd::journal::MirrorPeerClientMeta &cm =
        boost::get<librbd::journal::MirrorPeerClientMeta>(client_data.client_meta);
-      m_local_pool_id = cm.pool_id;
       m_local_image_id = cm.image_id;
-      m_snap_name = cm.snap_name;
+
+      // TODO: snap name should be transient
+      if (cm.sync_points.empty()) {
+        return -ENOENT;
+      }
+      m_snap_name = cm.sync_points.front().snap_name;
 
       dout(20) << "client found, pool_id=" << m_local_pool_id << ", image_id="
               << m_local_image_id << ", snap_name=" << m_snap_name << dendl;
@@ -539,27 +544,17 @@ int ImageReplayer::get_registered_client_status(bool *registered)
 
 int ImageReplayer::register_client()
 {
-  int r;
-
-  std::string local_cluster_id;
-  r = m_local->cluster_fsid(&local_cluster_id);
-  if (r < 0) {
-    derr << "error retrieving local cluster id: " << cpp_strerror(r)
-        << dendl;
-    return r;
-  }
+  // TODO allocate snap as part of sync process
   std::string m_snap_name = ".rbd-mirror." + m_client_id;
 
-  dout(20) << "m_cluster_id=" << local_cluster_id << ", pool_id="
-          << m_local_pool_id << ", image_id=" << m_local_image_id
-          << "snap_name=" << m_snap_name << dendl;
+  dout(20) << "mirror_uuid=" << m_client_id << ", "
+           << "image_id=" << m_local_image_id << ", "
+          << "snap_name=" << m_snap_name << dendl;
 
   bufferlist client_data;
   ::encode(librbd::journal::ClientData{librbd::journal::MirrorPeerClientMeta{
-       local_cluster_id, m_local_pool_id, m_local_image_id, m_snap_name}},
-    client_data);
-
-  r = m_remote_journaler->register_client(client_data);
+    m_local_image_id, {{m_snap_name, boost::none}}}}, client_data);
+  int r = m_remote_journaler->register_client(client_data);
   if (r < 0) {
     derr << "error registering client: " << cpp_strerror(r) << dendl;
     return r;
index 305a1762100cdb492325f14267f76857b825ccfd..4e94de8ef2e784dbeb67fd2b4ff3c1b421e8dd0d 100644 (file)
@@ -65,7 +65,8 @@ public:
 
 public:
   ImageReplayer(RadosRef local, RadosRef remote, const std::string &client_id,
-               int64_t remote_pool_id, const std::string &remote_image_id);
+               int64_t local_pool_id, int64_t remote_pool_id,
+                const std::string &remote_image_id);
   virtual ~ImageReplayer();
   ImageReplayer(const ImageReplayer&) = delete;
   ImageReplayer& operator=(const ImageReplayer&) = delete;
index 0d8e3f329fe4a4a1a70aeadc282c5e2dd31c4711..28b15ecee04773d46609d5a581de29c1c34f41e3 100644 (file)
@@ -118,6 +118,24 @@ void Replayer::set_sources(const map<int64_t, set<string> > &images)
 
   for (const auto &kv : images) {
     int64_t pool_id = kv.first;
+
+    // TODO: clean up once remote peer -> image replayer refactored
+    librados::IoCtx remote_ioctx;
+    int r = m_remote->ioctx_create2(pool_id, remote_ioctx);
+    if (r < 0) {
+      derr << "failed to lookup remote pool " << pool_id << ": "
+           << cpp_strerror(r) << dendl;
+      continue;
+    }
+
+    librados::IoCtx local_ioctx;
+    r = m_local->ioctx_create(remote_ioctx.get_pool_name().c_str(), local_ioctx);
+    if (r < 0) {
+      derr << "failed to lookup local pool " << remote_ioctx.get_pool_name()
+           << ": " << cpp_strerror(r) << dendl;
+      continue;
+    }
+
     // create entry for pool if it doesn't exist
     auto &pool_replayers = m_images[pool_id];
     for (const auto &image_id : kv.second) {
@@ -125,6 +143,7 @@ void Replayer::set_sources(const map<int64_t, set<string> > &images)
        unique_ptr<ImageReplayer> image_replayer(new ImageReplayer(m_local,
                                                                   m_remote,
                                                                   m_client_id,
+                                                                   local_ioctx.get_id(),
                                                                   pool_id,
                                                                   image_id));
        int r = image_replayer->start();