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) {
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)) {
return -EINVAL;
}
- update_pool_timestamp = true;
+ need_update_pool_timestamp = true;
}
ceph::bufferlist bl;
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;
return r;
}
+ std::string config_key;
+ if (util::is_metadata_config_override(key, &config_key)) {
+ update_pool_timestamp(io_ctx);
+ }
+
return 0;
}