From: Jason Dillaman Date: Mon, 13 Jun 2016 06:07:54 +0000 (-0400) Subject: rbd-mirror: handle an attempt to delete a non-mirrored image X-Git-Tag: v10.2.2~5^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ec809870cc2902d2bdf6543d911e23e71567303c;p=ceph.git rbd-mirror: handle an attempt to delete a non-mirrored image Signed-off-by: Jason Dillaman (cherry picked from commit 45dda67b3ef3d5dc5abb327fc1f242140f004d90) --- diff --git a/src/test/rbd_mirror/test_ImageDeleter.cc b/src/test/rbd_mirror/test_ImageDeleter.cc index b513492a49345..13869774a52fa 100644 --- a/src/test/rbd_mirror/test_ImageDeleter.cc +++ b/src/test/rbd_mirror/test_ImageDeleter.cc @@ -342,6 +342,11 @@ TEST_F(TestImageDeleter, Delete_Image_With_Clone) { TEST_F(TestImageDeleter, Delete_NonExistent_Image) { remove_image(); + cls::rbd::MirrorImage mirror_image(GLOBAL_IMAGE_ID, + MirrorImageState::MIRROR_IMAGE_STATE_ENABLED); + EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id, + mirror_image)); + m_deleter->schedule_image_delete(m_local_pool_id, m_local_image_id, m_image_name, GLOBAL_IMAGE_ID); @@ -358,6 +363,14 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image) { TEST_F(TestImageDeleter, Delete_NonExistent_Image_With_MirroringState) { remove_image(true); + cls::rbd::MirrorImage mirror_image(GLOBAL_IMAGE_ID, + MirrorImageState::MIRROR_IMAGE_STATE_ENABLED); + EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id, + mirror_image)); + mirror_image.state = MirrorImageState::MIRROR_IMAGE_STATE_DISABLING; + EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id, + mirror_image)); + m_deleter->schedule_image_delete(m_local_pool_id, m_local_image_id, m_image_name, GLOBAL_IMAGE_ID); @@ -371,6 +384,22 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image_With_MirroringState) { check_image_deleted(); } +TEST_F(TestImageDeleter, Delete_NonExistent_Image_Without_MirroringState) { + remove_image(); + + m_deleter->schedule_image_delete(m_local_pool_id, m_local_image_id, + m_image_name, GLOBAL_IMAGE_ID); + + C_SaferCond ctx; + m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx); + EXPECT_EQ(-ENOENT, ctx.wait()); + + ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size()); + ASSERT_EQ(0u, m_deleter->get_failed_queue_items().size()); + + check_image_deleted(); +} + TEST_F(TestImageDeleter, Fail_Delete_NonPrimary_Image) { ImageCtx *ictx = new ImageCtx("", m_local_image_id, "", m_local_io_ctx, false); diff --git a/src/tools/rbd_mirror/ImageDeleter.cc b/src/tools/rbd_mirror/ImageDeleter.cc index f67019aab4b6d..528c985dafce7 100644 --- a/src/tools/rbd_mirror/ImageDeleter.cc +++ b/src/tools/rbd_mirror/ImageDeleter.cc @@ -281,7 +281,14 @@ bool ImageDeleter::process_image_delete() { mirror_image.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING; r = cls_client::mirror_image_set(&ioctx, curr_deletion->local_image_id, mirror_image); - if (r == -EEXIST || r == -EINVAL) { + if (r == -ENOENT) { + dout(10) << "local image is not mirrored, aborting deletion..." << dendl; + m_delete_lock.Lock(); + DeleteInfo *del_info = curr_deletion.release(); + m_delete_lock.Unlock(); + del_info->notify(r); + return true; + } else if (r == -EEXIST || r == -EINVAL) { derr << "cannot disable mirroring for image id" << curr_deletion->local_image_id << ": global_image_id has changed/reused, aborting deletion: " << cpp_strerror(r) << dendl;