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);
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);
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);
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;