Merge pull request #37977 from dillaman/wip-48145

librbd: update hidden global config when removing pool config override

Reviewed-by: Mykola Golub <mgolub@suse.com>
This commit is contained in:
Mykola Golub 2020-11-13 16:47:46 +02:00 committed by GitHub
commit c721fe806d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -17,6 +17,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 <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;
}