From: Jason Dillaman Date: Fri, 10 Jun 2016 04:12:06 +0000 (-0400) Subject: rbd-mirror: image deleter properly handles multiple snapshots X-Git-Tag: v11.0.0~237^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d72a8cb67fbdc7361f8f9e265c659ddb96dc0f74;p=ceph.git rbd-mirror: image deleter properly handles multiple snapshots Fixes: http://tracker.ceph.com/issues/16226 Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/ImageDeleter.cc b/src/tools/rbd_mirror/ImageDeleter.cc index 8e65223659e..f67019aab4b 100644 --- a/src/tools/rbd_mirror/ImageDeleter.cc +++ b/src/tools/rbd_mirror/ImageDeleter.cc @@ -26,6 +26,7 @@ #include "librbd/ImageState.h" #include "librbd/Journal.h" #include "librbd/Operations.h" +#include "librbd/journal/Policy.h" #include "cls/rbd/cls_rbd_client.h" #include "cls/rbd/cls_rbd_types.h" #include "librbd/Utils.h" @@ -70,6 +71,16 @@ private: ImageDeleter *image_del; }; +struct DeleteJournalPolicy : public librbd::journal::Policy { + virtual void allocate_tag_on_lock(Context *on_finish) { + on_finish->complete(0); + } + + virtual void cancel_external_replay(Context *on_finish) { + on_finish->complete(0); + } +}; + } // anonymous namespace class ImageDeleterAdminSocketHook : public AdminSocketHook { @@ -302,10 +313,10 @@ bool ImageDeleter::process_image_delete() { return true; } - // We are disabling Journaling so that we can delete image snapshots - // of a non-primary image. Otherwise, we would fail to acquire the - // exclusive lock. - imgctx->features ^= RBD_FEATURE_JOURNALING; + { + RWLock::WLocker snap_locker(imgctx->snap_lock); + imgctx->set_journal_policy(new DeleteJournalPolicy()); + } std::vector snaps; r = librbd::snap_list(imgctx, snaps); @@ -354,16 +365,6 @@ bool ImageDeleter::process_image_delete() { enqueue_failed_delete(r); return true; } - - r = imgctx->state->refresh(); - if (r < 0) { - derr << "error refreshing image " << imgctx->name << ": " - << cpp_strerror(r) << dendl; - imgctx->state->close(); - enqueue_failed_delete(r); - return true; - } - imgctx->features ^= RBD_FEATURE_JOURNALING; } r = imgctx->operations->snap_remove(snap.name.c_str());