From 1c3e6df9a68c44e9de653eaef26c47d48e577ba9 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Sat, 7 Nov 2020 10:09:32 -0500 Subject: [PATCH] librbd: update hidden global config when removing pool config override 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 (cherry picked from commit 4ca1c4912b52d6a7945decd443ddcaf3533dcdf9) --- src/librbd/api/PoolMetadata.cc | 55 +++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/librbd/api/PoolMetadata.cc b/src/librbd/api/PoolMetadata.cc index 0a3c5ca61309b..f3d539445de02 100644 --- a/src/librbd/api/PoolMetadata.cc +++ b/src/librbd/api/PoolMetadata.cc @@ -15,6 +15,32 @@ 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 int PoolMetadata::get(librados::IoCtx& io_ctx, const std::string &key, std::string *value) { @@ -34,7 +60,7 @@ int PoolMetadata::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)) { @@ -50,7 +76,7 @@ int PoolMetadata::set(librados::IoCtx& io_ctx, const std::string &key, return -EINVAL; } - update_pool_timestamp = true; + need_update_pool_timestamp = true; } ceph::bufferlist bl; @@ -63,24 +89,8 @@ int PoolMetadata::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; @@ -109,6 +119,11 @@ int PoolMetadata::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; } -- 2.39.5