From: Jason Dillaman Date: Thu, 25 Feb 2016 21:06:44 +0000 (-0500) Subject: rbd-mirror: local pool id no longer stored in client registration X-Git-Tag: v10.1.0~187^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=708c72cb0a9e62fca671d593bea0f77b3bd59d0b;p=ceph.git rbd-mirror: local pool id no longer stored in client registration The remote pool name should match the remote pool name. Signed-off-by: Jason Dillaman --- diff --git a/src/test/rbd_mirror/image_replay.cc b/src/test/rbd_mirror/image_replay.cc index cb175f8394b..e23f057996a 100644 --- a/src/test/rbd_mirror/image_replay.cc +++ b/src/test/rbd_mirror/image_replay.cc @@ -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) { diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc index 80f9505e294..56172992e0b 100644 --- a/src/test/rbd_mirror/test_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_ImageReplayer.cc @@ -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(); } diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 04e135f098c..d3cd665f091 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -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(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; diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h index 305a1762100..4e94de8ef2e 100644 --- a/src/tools/rbd_mirror/ImageReplayer.h +++ b/src/tools/rbd_mirror/ImageReplayer.h @@ -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; diff --git a/src/tools/rbd_mirror/Replayer.cc b/src/tools/rbd_mirror/Replayer.cc index 0d8e3f329fe..28b15ecee04 100644 --- a/src/tools/rbd_mirror/Replayer.cc +++ b/src/tools/rbd_mirror/Replayer.cc @@ -118,6 +118,24 @@ void Replayer::set_sources(const map > &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 > &images) unique_ptr image_replayer(new ImageReplayer(m_local, m_remote, m_client_id, + local_ioctx.get_id(), pool_id, image_id)); int r = image_replayer->start();