]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: update hidden global config when removing pool config override
authorJason Dillaman <dillaman@redhat.com>
Sat, 7 Nov 2020 15:09:32 +0000 (10:09 -0500)
committerJason Dillaman <dillaman@redhat.com>
Sat, 7 Nov 2020 15:09:32 +0000 (10:09 -0500)
The remove notification was missed and therefore in-use images will not
properly remove pool config overrides.

Fixes: https://tracker.ceph.com/issues/48145
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/api/PoolMetadata.cc

index ea3d43d6e6e9141006a36037805b51413b563555..33e3fb6486f921e595b5b47079116edadf75a758 100644 (file)
 namespace librbd {
 namespace api {
 
+namespace {
+
+void update_pool_timestamp(librados::IoCtx& io_ctx) {
+  CephContext *cct = (CephContext *)io_ctx.cct();
+
+  auto now = ceph_clock_now();
+  std::string cmd =
+    R"({)"
+      R"("prefix": "config set", )"
+      R"("who": "global", )"
+      R"("name": "rbd_config_pool_override_update_timestamp", )"
+      R"("value": ")" + stringify(now.sec()) + R"(")"
+    R"(})";
+
+  librados::Rados rados(io_ctx);
+  bufferlist in_bl;
+  std::string ss;
+  int r = rados.mon_command(cmd, in_bl, nullptr, &ss);
+  if (r < 0) {
+    lderr(cct) << "failed to notify clients of pool config update: "
+               << cpp_strerror(r) << dendl;
+  }
+}
+
+} // anonymous namespace
+
 template <typename I>
 int PoolMetadata<I>::get(librados::IoCtx& io_ctx,
                      const std::string &key, std::string *value) {
@@ -36,7 +62,7 @@ int PoolMetadata<I>::set(librados::IoCtx& io_ctx, const std::string &key,
                          const std::string &value) {
   CephContext *cct = (CephContext *)io_ctx.cct();
 
-  bool update_pool_timestamp = false;
+  bool need_update_pool_timestamp = false;
 
   std::string config_key;
   if (util::is_metadata_config_override(key, &config_key)) {
@@ -52,7 +78,7 @@ int PoolMetadata<I>::set(librados::IoCtx& io_ctx, const std::string &key,
       return -EINVAL;
     }
 
-    update_pool_timestamp = true;
+    need_update_pool_timestamp = true;
   }
 
   ceph::bufferlist bl;
@@ -65,24 +91,8 @@ int PoolMetadata<I>::set(librados::IoCtx& io_ctx, const std::string &key,
     return r;
   }
 
-  if (update_pool_timestamp) {
-    auto now = ceph_clock_now();
-    std::string cmd =
-      R"({)"
-        R"("prefix": "config set", )"
-        R"("who": "global", )"
-        R"("name": "rbd_config_pool_override_update_timestamp", )"
-        R"("value": ")" + stringify(now.sec()) + R"(")"
-      R"(})";
-
-    librados::Rados rados(io_ctx);
-    bufferlist in_bl;
-    std::string ss;
-    r = rados.mon_command(cmd, in_bl, nullptr, &ss);
-    if (r < 0) {
-      lderr(cct) << "failed to notify clients of pool config update: "
-                 << cpp_strerror(r) << dendl;
-    }
+  if (need_update_pool_timestamp) {
+    update_pool_timestamp(io_ctx);
   }
 
   return 0;
@@ -111,6 +121,11 @@ int PoolMetadata<I>::remove(librados::IoCtx& io_ctx, const std::string &key) {
     return r;
   }
 
+  std::string config_key;
+  if (util::is_metadata_config_override(key, &config_key)) {
+    update_pool_timestamp(io_ctx);
+  }
+
   return 0;
 }