return;
}
+ update_primary_snapshot();
+}
+
+template <typename I>
+void SetImageStateRequest<I>::update_primary_snapshot() {
+ CephContext *cct = m_image_ctx->cct;
+ ldout(cct, 20) << dendl;
+
+ librados::ObjectWriteOperation op;
+ librbd::cls_client::mirror_image_snapshot_set_copy_progress(
+ &op, m_snap_id, true, 0);
+
+ auto aio_comp = create_rados_callback<
+ SetImageStateRequest<I>,
+ &SetImageStateRequest<I>::handle_update_primary_snapshot>(this);
+ int r = m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, aio_comp,
+ &op);
+ ceph_assert(r == 0);
+ aio_comp->release();
+}
+
+template <typename I>
+void SetImageStateRequest<I>::handle_update_primary_snapshot(int r) {
+ CephContext *cct = m_image_ctx->cct;
+ ldout(cct, 20) << "r=" << r << dendl;
+
+ if (r < 0) {
+ lderr(cct) << "failed to update primary snapshot: " << cpp_strerror(r)
+ << dendl;
+ finish(r);
+ return;
+ }
+
finish(0);
}
{
REQUIRE_FORMAT_V2();
+ ASSERT_EQ(0, m_rbd.mirror_mode_set(m_ioctx, RBD_MIRROR_MODE_IMAGE));
+
uint64_t features;
ASSERT_TRUE(get_features(&features));
int order = 20;
librbd::Image image;
ASSERT_EQ(0, m_rbd.open(m_ioctx, image, image_name.c_str()));
ASSERT_EQ(0, image.snap_create("snap"));
+ ASSERT_EQ(0, image.mirror_image_enable2(RBD_MIRROR_IMAGE_MODE_SNAPSHOT));
+ std::vector<librbd::snap_info_t> snaps;
+ ASSERT_EQ(0, image.snap_list(snaps));
+ ASSERT_EQ(2U, snaps.size());
+ auto snap_id = snaps[1].id;
auto ictx = new librbd::ImageCtx(image_name, "", nullptr, m_ioctx, false);
ASSERT_EQ(0, ictx->state->open(0));
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::SetImageStateRequest<>::create(
- ictx, 123, &cond);
+ ictx, snap_id, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::GetImageStateRequest<>::create(
- ictx, 123, &image_state, &cond);
+ ictx, snap_id, &image_state, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::RemoveImageStateRequest<>::create(
- ictx, 123, &cond);
+ ictx, snap_id, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::SetImageStateRequest<>::create(
- ictx, 123, &cond);
+ ictx, snap_id, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::GetImageStateRequest<>::create(
- ictx, 123, &image_state, &cond);
+ ictx, snap_id, &image_state, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}
{
C_SaferCond cond;
auto req = librbd::mirror::snapshot::RemoveImageStateRequest<>::create(
- ictx, 123, &cond);
+ ictx, snap_id, &cond);
req->send();
ASSERT_EQ(0, cond.wait());
}