From: weixinwei Date: Tue, 15 Nov 2022 07:31:06 +0000 (+0800) Subject: librbd: avoid EUCLEAN error after "rbd rm" is interrupted X-Git-Tag: v17.2.6~132^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F50130%2Fhead;p=ceph.git librbd: avoid EUCLEAN error after "rbd rm" is interrupted If "rbd rm" command is interrupted (e.g. killed), the image in the trash stays in cls::rbd::TRASH_IMAGE_STATE_MOVING state. Later, when "rbd rm" command is rerun, EUCLEAN error is returned. Fixes: https://tracker.ceph.com/issues/58060 Signed-off-by: weixinwei (cherry picked from commit 145ecb15c2b6b240a4abb5a0d81d081efeb98614) --- diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index 772dd7f058ea..88521759e856 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -787,12 +787,24 @@ int Image::remove(IoCtx& io_ctx, const std::string &image_name, r = Trash::list(io_ctx, trash_entries, false); if (r < 0) { return r; - } else if (r >= 0) { - for (auto& entry : trash_entries) { - if (entry.name == image_name && - entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) { - return Trash::remove(io_ctx, entry.id, true, prog_ctx); + } + for (auto& entry : trash_entries) { + if (entry.name == image_name && + entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) { + cls::rbd::TrashImageSpec spec; + r = cls_client::trash_get(&io_ctx, entry.id, &spec); + if (r < 0) { + lderr(cct) << "error getting image id " << entry.id + << " info from trash: " << cpp_strerror(r) << dendl; + return r; + } + if (spec.state == cls::rbd::TRASH_IMAGE_STATE_MOVING) { + r = Trash::move(io_ctx, entry.source, entry.name, entry.id, 0); + if (r < 0) { + return r; + } } + return Trash::remove(io_ctx, entry.id, true, prog_ctx); } }