]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: handle an attempt to delete a non-mirrored image
authorJason Dillaman <dillaman@redhat.com>
Mon, 13 Jun 2016 06:07:54 +0000 (02:07 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 13 Jun 2016 06:33:59 +0000 (02:33 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_ImageDeleter.cc
src/tools/rbd_mirror/ImageDeleter.cc

index b513492a4934531df6e26ebb77dcd31a16d244b5..13869774a52facc594b5ee9557e6ef7be7ac5e15 100644 (file)
@@ -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);
index f67019aab4b6d0835cfe6c11a2ac154a32b0c970..528c985dafce7d4bdf9267f1fe1019d7fe8f0908 100644 (file)
@@ -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;