Avoid leaving RBD pool objects within a pool namespace that is
being deleted.
Fixes: https://tracker.ceph.com/issues/43378
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit
9e29914a6a9581ea8b41f3d3efd61f254fafeeff)
Conflicts:
src/librbd/api/Namespace.cc
- "r = Mirror<I>::mode_set(ns_ctx, RBD_MIRROR_MODE_DISABLED)"
block is missing in nautilus
namespace librbd {
namespace api {
+namespace {
+
+const std::list<std::string> POOL_OBJECTS {
+ RBD_CHILDREN,
+ RBD_GROUP_DIRECTORY,
+ RBD_INFO,
+ RBD_MIRRORING,
+ RBD_TASK,
+ RBD_TRASH,
+ RBD_DIRECTORY
+};
+
+} // anonymous namespace
+
template <typename I>
int Namespace<I>::create(librados::IoCtx& io_ctx, const std::string& name)
{
goto rollback;
}
+ for (auto& oid : POOL_OBJECTS) {
+ r = ns_ctx.remove(oid);
+ if (r < 0 && r != -ENOENT) {
+ lderr(cct) << "failed to remove object '" << oid << "': "
+ << cpp_strerror(r) << dendl;
+ return r;
+ }
+ }
+
r = cls_client::namespace_remove(&default_ns_ctx, name);
if (r < 0) {
lderr(cct) << "failed to remove namespace: " << cpp_strerror(r) << dendl;