return false;
}
+template <typename I>
+void GroupReplayer<I>::sync_group_names() {
+ dout(10) << dendl;
+
+ std::string local_group_name;
+ std::string remote_group_name;
+ int r = librbd::cls_client::dir_get_name(&m_local_io_ctx,
+ RBD_GROUP_DIRECTORY,
+ m_local_group_id,
+ &local_group_name);
+ if (r < 0) {
+ derr << "failed to retrieve local group name: "
+ << cpp_strerror(r) << dendl;
+ return;
+ }
+
+ r = librbd::cls_client::dir_get_name(&m_remote_group_peer.io_ctx,
+ RBD_GROUP_DIRECTORY,
+ m_remote_group_id,
+ &remote_group_name);
+ if (r < 0) {
+ derr << "failed to retrieve remote group name: "
+ << cpp_strerror(r) << dendl;
+ return;
+ }
+
+ if (local_group_name != remote_group_name) {
+ dout(5) << "group renamed. local group name: " << local_group_name
+ << ", remote group name: " << remote_group_name << dendl;
+
+ r = librbd::cls_client::group_dir_rename(&m_local_io_ctx,
+ RBD_GROUP_DIRECTORY,
+ local_group_name,
+ remote_group_name,
+ m_local_group_id);
+ if (r < 0) {
+ derr << "error renaming group from directory"
+ << cpp_strerror(r) << dendl;
+ return;
+ }
+
+ m_local_group_name = remote_group_name;
+ reregister_admin_socket_hook();
+ }
+}
+
template <typename I>
image_replayer::HealthState GroupReplayer<I>::get_health_state() const {
// TODO: Implement something like m_mirror_image_status_state for group
m_threads, m_local_io_ctx, m_remote_group_peer.io_ctx, m_global_group_id,
m_local_mirror_uuid, m_instance_watcher, m_local_status_updater,
m_remote_group_peer.mirror_status_updater, m_cache_manager_handler,
- m_pool_meta_cache, &m_remote_group_id, &m_local_group_ctx,
- &m_image_replayers, &m_image_replayer_index, ctx);
+ m_pool_meta_cache, &m_local_group_id, &m_remote_group_id,
+ &m_local_group_ctx, &m_image_replayers, &m_image_replayer_index, ctx);
request->get();
m_bootstrap_request = request;
MirrorStatusUpdater<I> *remote_status_updater,
journal::CacheManagerHandler *cache_manager_handler,
PoolMetaCache *pool_meta_cache,
+ std::string *local_group_id,
std::string *remote_group_id,
GroupCtx *local_group_ctx,
std::list<std::pair<librados::IoCtx, ImageReplayer<I> *>> *image_replayers,
m_remote_status_updater(remote_status_updater),
m_cache_manager_handler(cache_manager_handler),
m_pool_meta_cache(pool_meta_cache),
+ m_local_group_id(local_group_id),
m_remote_group_id(remote_group_id),
m_local_group_ctx(local_group_ctx),
m_image_replayers(image_replayers),
if (r == 0) {
auto iter = m_out_bl.cbegin();
r = librbd::cls_client::mirror_group_get_group_id_finish(
- &iter, &m_local_group_id);
+ &iter, m_local_group_id);
}
if (r < 0) {
dout(10) << dendl;
librados::ObjectReadOperation op;
- librbd::cls_client::dir_get_name_start(&op, m_local_group_id);
+ librbd::cls_client::dir_get_name_start(&op, *m_local_group_id);
m_out_bl.clear();
auto comp = create_rados_callback<
BootstrapRequest<I>,
if (r == 0) {
auto iter = m_out_bl.cbegin();
- r = librbd::cls_client::dir_get_id_finish(&iter, &m_local_group_id);
+ r = librbd::cls_client::dir_get_id_finish(&iter, m_local_group_id);
}
if (r < 0) {
dout(10) << dendl;
librados::ObjectReadOperation op;
- librbd::cls_client::mirror_group_get_start(&op, m_local_group_id);
+ librbd::cls_client::mirror_group_get_start(&op, *m_local_group_id);
m_out_bl.clear();
auto comp = create_rados_callback<
BootstrapRequest<I>,
&BootstrapRequest<I>::handle_list_local_group_snapshots>(this);
auto req = librbd::group::ListSnapshotsRequest<I>::create(m_local_io_ctx,
- m_local_group_id, true, true, &m_local_group_snaps, ctx);
+ *m_local_group_id, true, true, &m_local_group_snaps, ctx);
req->send();
}
&BootstrapRequest<I>::handle_list_local_group>(this);
m_out_bl.clear();
int r = m_local_io_ctx.aio_operate(
- librbd::util::group_header_name(m_local_group_id), comp, &op, &m_out_bl);
+ librbd::util::group_header_name(*m_local_group_id), comp, &op, &m_out_bl);
ceph_assert(r == 0);
comp->release();
}
&BootstrapRequest<I>::handle_remove_local_image_from_group>(this);
auto req = librbd::group::RemoveImageRequest<I>::create(
- m_local_io_ctx, m_local_group_id, m_image_io_ctx, image_id, ctx);
+ m_local_io_ctx, *m_local_group_id, m_image_io_ctx, image_id, ctx);
req->send();
}
librados::ObjectWriteOperation op;
m_local_mirror_group.state = cls::rbd::MIRROR_GROUP_STATE_DISABLING;
- librbd::cls_client::mirror_group_set(&op, m_local_group_id,
+ librbd::cls_client::mirror_group_set(&op, *m_local_group_id,
m_local_mirror_group);
auto comp = create_rados_callback<
dout(10) << dendl;
librados::ObjectWriteOperation op;
- librbd::cls_client::mirror_group_remove(&op, m_local_group_id);
+ librbd::cls_client::mirror_group_remove(&op, *m_local_group_id);
auto comp = create_rados_callback<
BootstrapRequest<I>,
template <typename I>
void BootstrapRequest<I>::remove_local_group() {
- dout(10) << m_group_name << " " << m_local_group_id << dendl;
+ dout(10) << m_group_name << " " << *m_local_group_id << dendl;
- ceph_assert(!m_local_group_id.empty());
+ ceph_assert(!m_local_group_id->empty());
ceph_assert(!m_group_name.empty());
librados::ObjectWriteOperation op;
&BootstrapRequest<I>::handle_remove_local_group>(this);
int r = m_local_io_ctx.aio_operate(
- librbd::util::group_header_name(m_local_group_id), comp, &op);
+ librbd::util::group_header_name(*m_local_group_id), comp, &op);
ceph_assert(r == 0);
comp->release();
}
dout(10) << dendl;
librados::ObjectWriteOperation op;
- librbd::cls_client::group_dir_remove(&op, m_group_name, m_local_group_id);
+ librbd::cls_client::group_dir_remove(&op, m_group_name, *m_local_group_id);
auto comp = create_rados_callback<
BootstrapRequest<I>,
finish(0);
}
-
template <typename I>
void BootstrapRequest<I>::create_local_group_id() {
dout(10) << dendl;
- m_local_group_id = librbd::util::generate_uuid(m_local_io_ctx);
+ *m_local_group_id = librbd::util::generate_image_id(m_local_io_ctx);
librados::ObjectWriteOperation op;
- librbd::cls_client::group_dir_add(&op, m_group_name, m_local_group_id);
+ librbd::cls_client::group_dir_add(&op, m_group_name, *m_local_group_id);
auto comp = create_rados_callback<
BootstrapRequest<I>,
&BootstrapRequest<I>::handle_create_local_group>(this);
int r = m_local_io_ctx.aio_operate(
- librbd::util::group_header_name(m_local_group_id), comp, &op);
+ librbd::util::group_header_name(*m_local_group_id), comp, &op);
ceph_assert(r == 0);
comp->release();
}
m_local_mirror_group = {m_global_group_id,
m_remote_mirror_group.mirror_image_mode,
cls::rbd::MIRROR_GROUP_STATE_ENABLED};
- librbd::cls_client::mirror_group_set(&op, m_local_group_id,
+ librbd::cls_client::mirror_group_set(&op, *m_local_group_id,
m_local_mirror_group);
auto comp = create_rados_callback<
BootstrapRequest<I>,
if (m_local_mirror_group.state == cls::rbd::MIRROR_GROUP_STATE_DISABLED) {
r = -ENOENT;
} else {
- *m_local_group_ctx = {m_group_name, m_local_group_id, m_global_group_id,
+ *m_local_group_ctx = {m_group_name, *m_local_group_id, m_global_group_id,
m_local_mirror_group_primary, m_local_io_ctx};
r = create_replayers();
}
MirrorStatusUpdater<ImageCtxT> *remote_status_updater,
journal::CacheManagerHandler *cache_manager_handler,
PoolMetaCache *pool_meta_cache,
+ std::string *local_group_id,
std::string *remote_group_id,
GroupCtx *local_group_ctx,
std::list<std::pair<librados::IoCtx, ImageReplayer<ImageCtxT> *>> *image_replayers,
return new BootstrapRequest(
threads, local_io_ctx, remote_io_ctx, global_group_id, local_mirror_uuid,
instance_watcher, local_status_updater, remote_status_updater,
- cache_manager_handler, pool_meta_cache, remote_group_id, local_group_ctx,
- image_replayers, image_replayer_index, on_finish);
+ cache_manager_handler, pool_meta_cache, local_group_id, remote_group_id,
+ local_group_ctx, image_replayers, image_replayer_index, on_finish);
}
BootstrapRequest(
MirrorStatusUpdater<ImageCtxT> *remote_status_updater,
journal::CacheManagerHandler *cache_manager_handler,
PoolMetaCache *pool_meta_cache,
+ std::string *local_group_id,
std::string *remote_group_id,
GroupCtx *local_group_ctx,
std::list<std::pair<librados::IoCtx, ImageReplayer<ImageCtxT> *>> *image_replayers,
MirrorStatusUpdater<ImageCtxT> *m_remote_status_updater;
journal::CacheManagerHandler *m_cache_manager_handler;
PoolMetaCache *m_pool_meta_cache;
+ std::string *m_local_group_id;
std::string *m_remote_group_id;
GroupCtx *m_local_group_ctx;
std::list<std::pair<librados::IoCtx, ImageReplayer<ImageCtxT> *>> *m_image_replayers;
std::atomic<bool> m_canceled = false;
std::string m_group_name;
- std::string m_local_group_id;
bool m_local_group_id_by_name = false;
cls::rbd::MirrorGroup m_remote_mirror_group;
cls::rbd::MirrorGroup m_local_mirror_group;