The remote pool name should match the remote pool name.
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
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;
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;
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) {
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();
}
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),
}
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;
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;
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;
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) {
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();