From 4718b7cb2fac65b2ac7014f42ba1a10181350f0b Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 6 Jul 2018 17:20:32 +0800 Subject: [PATCH] common,rbd,rgw,osd: extract config values into ConfigValues this change introduce three classes: ConfigValues, ConfigProxy and ConfigReader. in seastar port of OSD, each CPU shard will hold its own reference of configuration, and upon changes of settings, each shard will be updated with the new setting in async. so this forces us to be able to keep two set of configuration at the same time. so we need to extract the changeable part of md_config_t out. so we can replace the old one with new one on demand, and let different shards share the same unchanged part, amon the other things, the Options map and the lookup tables. that's why we need ConfigValues. we will add a policy template for this class, so we can specialize for Seastar implementation to allow different ConfigProxy instances to point md_config_impl<> to different ConfigValues. because the observer interface is still using md_config_t, to minimise the impact of this change, handle_conf_change() and handle_subsys_change() are not changed. but as it accepts a `const md_config_t`, which cannot be used to create/reference the ConfigProxy holding it, we need to introduce ConfigReader for reading the updated setting from md_config_t in a simpler way, without exposing the internal "values" member variable. Signed-off-by: Kefu Chai --- src/CMakeLists.txt | 1 + src/auth/KeyRing.cc | 2 +- src/ceph_mon.cc | 114 ++++---- src/ceph_osd.cc | 36 +-- src/ceph_syn.cc | 2 +- src/client/Client.cc | 62 ++--- src/common/HeartbeatMap.cc | 2 +- src/common/LogClient.cc | 2 +- src/common/PluginRegistry.cc | 4 +- src/common/TracepointProvider.cc | 10 +- src/common/TracepointProvider.h | 2 +- src/common/WorkQueue.cc | 4 +- src/common/ceph_context.cc | 62 ++--- src/common/ceph_context.h | 4 +- src/common/common_init.cc | 18 +- src/common/config.cc | 211 ++++++--------- src/common/config.h | 70 +---- src/common/config_cacher.h | 4 +- src/common/config_fwd.h | 1 + src/common/config_proxy.h | 162 +++++++++++ src/common/config_values.cc | 84 ++++++ src/common/config_values.h | 91 +++++++ src/common/pick_address.cc | 46 ++-- src/common/shared_cache.hpp | 2 +- src/crush/CrushWrapper.cc | 2 +- src/global/global_context.cc | 4 +- src/global/global_context.h | 2 +- src/global/global_init.cc | 89 +++---- src/global/pidfile.cc | 6 +- src/global/pidfile.h | 2 +- src/global/signal_handler.cc | 2 +- src/krbd.cc | 6 +- src/kv/LevelDBStore.cc | 20 +- src/kv/RocksDBStore.cc | 62 ++--- src/libcephfs.cc | 26 +- src/librados/RadosClient.h | 2 +- src/librados/librados.cc | 48 ++-- src/librbd/ImageCtx.cc | 8 +- src/librbd/ImageState.cc | 2 +- src/librbd/ImageWatcher.cc | 2 +- src/librbd/Journal.cc | 2 +- src/librbd/Utils.cc | 2 +- src/librbd/deep_copy/ImageCopyRequest.cc | 2 +- src/librbd/image/CloneRequest.cc | 2 +- src/librbd/image/CreateRequest.cc | 16 +- src/librbd/internal.cc | 6 +- src/librbd/librbd.cc | 8 +- src/log/Log.cc | 2 +- src/log/Log.h | 4 +- src/log/SubsystemMap.h | 4 +- src/mds/Beacon.cc | 42 +-- src/mds/CDir.cc | 16 +- src/mds/CDir.h | 4 +- src/mds/CInode.cc | 22 +- src/mds/CInode.h | 2 +- src/mds/DamageTable.cc | 2 +- src/mds/FSMap.cc | 2 +- src/mds/Locker.cc | 10 +- src/mds/MDBalancer.cc | 54 ++-- src/mds/MDCache.cc | 78 +++--- src/mds/MDCache.h | 10 +- src/mds/MDLog.cc | 26 +- src/mds/MDSDaemon.cc | 29 +- src/mds/MDSRank.cc | 54 ++-- src/mds/MDSTableClient.cc | 8 +- src/mds/MDSTableServer.cc | 10 +- src/mds/Migrator.cc | 58 ++-- src/mds/Migrator.h | 2 +- src/mds/PurgeQueue.cc | 10 +- src/mds/RecoveryQueue.cc | 2 +- src/mds/ScrubStack.cc | 6 +- src/mds/Server.cc | 84 +++--- src/mds/SessionMap.cc | 8 +- src/mds/journal.cc | 24 +- src/mgr/ActivePyModules.cc | 4 +- src/mgr/BaseMgrModule.cc | 2 +- src/mgr/BaseMgrStandbyModule.cc | 2 +- src/mgr/DaemonServer.cc | 52 ++-- src/mgr/MgrClient.cc | 10 +- src/mgr/MgrStandby.cc | 8 +- src/mgr/PyModule.cc | 2 +- src/mgr/PyModuleRegistry.cc | 4 +- src/mgr/PyModuleRunner.cc | 2 +- src/mon/AuthMonitor.cc | 24 +- src/mon/ConfigKeyService.cc | 4 +- src/mon/ConfigMonitor.cc | 16 +- src/mon/Elector.cc | 2 +- src/mon/FSCommands.cc | 2 +- src/mon/HealthMonitor.cc | 14 +- src/mon/LogMonitor.cc | 36 +-- src/mon/LogMonitor.h | 4 +- src/mon/MDSMonitor.cc | 30 +-- src/mon/MgrMonitor.cc | 16 +- src/mon/MonClient.cc | 10 +- src/mon/MonMap.cc | 16 +- src/mon/Monitor.cc | 153 +++++------ src/mon/Monitor.h | 2 +- src/mon/MonitorDBStore.h | 24 +- src/mon/MonmapMonitor.cc | 2 +- src/mon/OSDMonitor.cc | 252 +++++++++--------- src/mon/PGMap.cc | 34 +-- src/mon/Paxos.cc | 48 ++-- src/mon/Paxos.h | 2 +- src/mon/PaxosService.cc | 26 +- src/mon/QuorumService.h | 2 +- src/msg/Messenger.cc | 25 +- src/msg/Messenger.h | 15 +- src/msg/Policy.h | 2 +- src/msg/async/AsyncConnection.cc | 2 +- src/msg/async/AsyncMessenger.cc | 2 +- src/msg/simple/Accepter.cc | 2 +- src/msg/simple/Pipe.cc | 6 +- src/os/FuseStore.cc | 4 +- src/os/bluestore/BlueFS.h | 2 +- src/os/bluestore/BlueStore.cc | 45 ++-- src/os/bluestore/NVMEDevice.cc | 8 +- src/os/filestore/FDCache.h | 7 +- src/os/filestore/FileJournal.h | 4 +- src/os/filestore/FileStore.cc | 11 +- src/os/filestore/WBThrottle.cc | 4 +- src/osd/ECBackend.cc | 2 +- src/osd/OSD.cc | 66 ++--- src/osd/OSD.h | 6 +- src/osd/OSDMap.cc | 38 +-- src/osd/PG.cc | 8 +- src/osd/PGBackend.cc | 2 +- src/osd/PrimaryLogPG.cc | 8 +- src/osd/ReplicatedBackend.cc | 4 +- src/osd/Session.cc | 2 +- src/osd/SnapMapper.cc | 10 +- src/osdc/Journaler.cc | 6 +- src/osdc/Objecter.cc | 4 +- src/perfglue/heap_profiler.cc | 16 +- src/rgw/rgw_cache.h | 2 +- src/rgw/rgw_client_io_filters.h | 2 +- src/rgw/rgw_cr_rados.cc | 6 +- src/rgw/rgw_lc.cc | 4 +- src/rgw/rgw_op.cc | 6 +- src/rgw/rgw_op.h | 6 +- src/rgw/rgw_rados.cc | 2 +- src/rgw/rgw_rados.h | 2 +- src/rgw/rgw_rest.cc | 8 +- src/rgw/rgw_rest_s3.cc | 2 +- src/rgw/rgw_sync_log_trim.cc | 10 +- src/rgw/rgw_torrent.cc | 12 +- src/test/confutils.cc | 14 +- src/test/daemon_config.cc | 143 +++++----- .../librados_test_stub/LibradosTestStub.cc | 24 +- src/test/librbd/journal/test_Entries.cc | 2 +- src/test/librbd/test_internal.cc | 2 +- src/test/objectstore/store_test_fixture.cc | 4 +- src/test/rbd_mirror/image_map/test_Policy.cc | 2 +- src/test/rbd_mirror/test_ImageReplayer.cc | 6 +- src/tools/ceph_authtool.cc | 4 +- src/tools/ceph_conf.cc | 18 +- src/tools/monmaptool.cc | 8 +- src/tools/rbd/Utils.cc | 2 +- src/tools/rbd_mirror/ImageDeleter.cc | 4 +- src/tools/rbd_mirror/ImageMap.cc | 8 +- src/tools/rbd_mirror/ImageReplayer.cc | 2 +- src/tools/rbd_mirror/ImageSync.cc | 2 +- src/tools/rbd_mirror/ImageSyncThrottler.cc | 6 +- src/tools/rbd_mirror/InstanceReplayer.cc | 2 +- src/tools/rbd_mirror/InstanceWatcher.cc | 2 +- src/tools/rbd_mirror/Instances.cc | 6 +- src/tools/rbd_mirror/LeaderWatcher.cc | 8 +- src/tools/rbd_mirror/Mirror.cc | 2 +- src/tools/rbd_mirror/PoolReplayer.cc | 28 +- src/tools/rbd_mirror/Threads.cc | 4 +- src/tools/rbd_mirror/image_map/Policy.cc | 2 +- .../image_replayer/CreateImageRequest.cc | 2 +- .../PrepareRemoteImageRequest.cc | 4 +- src/tools/rbd_nbd/rbd-nbd.cc | 6 +- 173 files changed, 1828 insertions(+), 1557 deletions(-) create mode 100644 src/common/config_proxy.h create mode 100644 src/common/config_values.cc create mode 100644 src/common/config_values.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3868956ba5ae7..c0db73d7a804b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -517,6 +517,7 @@ set(libcommon_files common/ceph_frag.cc common/options.cc common/config.cc + common/config_values.cc common/utf8.c common/mime.c common/strtol.cc diff --git a/src/auth/KeyRing.cc b/src/auth/KeyRing.cc index c9e092e440074..01bb9c761a29b 100644 --- a/src/auth/KeyRing.cc +++ b/src/auth/KeyRing.cc @@ -30,7 +30,7 @@ int KeyRing::from_ceph_context(CephContext *cct) { - const md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; string filename; int ret = ceph_resolve_file_search(conf->keyring, filename); diff --git a/src/ceph_mon.cc b/src/ceph_mon.cc index a195452a60f53..efbdf3b6d2498 100644 --- a/src/ceph_mon.cc +++ b/src/ceph_mon.cc @@ -104,7 +104,7 @@ int obtain_monmap(MonitorDBStore &store, bufferlist &bl) int check_mon_data_exists() { - string mon_data = g_conf->mon_data; + string mon_data = g_conf()->mon_data; struct stat buf; if (::stat(mon_data.c_str(), &buf)) { if (errno != ENOENT) { @@ -128,7 +128,7 @@ int check_mon_data_exists() */ int check_mon_data_empty() { - string mon_data = g_conf->mon_data; + string mon_data = g_conf()->mon_data; DIR *dir = ::opendir(mon_data.c_str()); if (!dir) { @@ -286,12 +286,12 @@ int main(int argc, const char **argv) exit(1); } - if (g_conf->mon_data.empty()) { + if (g_conf()->mon_data.empty()) { cerr << "must specify '--mon-data=foo' data path" << std::endl; exit(1); } - if (g_conf->name.get_id().empty()) { + if (g_conf()->name.get_id().empty()) { cerr << "must specify id (--id or --name mon.)" << std::endl; exit(1); } @@ -301,13 +301,13 @@ int main(int argc, const char **argv) int err = check_mon_data_exists(); if (err == -ENOENT) { - if (::mkdir(g_conf->mon_data.c_str(), 0755)) { - derr << "mkdir(" << g_conf->mon_data << ") : " + if (::mkdir(g_conf()->mon_data.c_str(), 0755)) { + derr << "mkdir(" << g_conf()->mon_data << ") : " << cpp_strerror(errno) << dendl; exit(1); } } else if (err < 0) { - derr << "error opening '" << g_conf->mon_data << "': " + derr << "error opening '" << g_conf()->mon_data << "': " << cpp_strerror(-err) << dendl; exit(-err); } @@ -315,11 +315,11 @@ int main(int argc, const char **argv) err = check_mon_data_empty(); if (err == -ENOTEMPTY) { // Mon may exist. Let the user know and exit gracefully. - derr << "'" << g_conf->mon_data << "' already exists and is not empty" + derr << "'" << g_conf()->mon_data << "' already exists and is not empty" << ": monitor may already exist" << dendl; exit(0); } else if (err < 0) { - derr << "error checking if '" << g_conf->mon_data << "' is empty: " + derr << "error checking if '" << g_conf()->mon_data << "' is empty: " << cpp_strerror(-err) << dendl; exit(-err); } @@ -334,7 +334,7 @@ int main(int argc, const char **argv) MonMap monmap; // load or generate monmap - const auto monmap_fn = g_conf->get_val("monmap"); + const auto monmap_fn = g_conf().get_val("monmap"); if (monmap_fn.length()) { int err = monmapbl.read_file(monmap_fn.c_str(), &error); if (err < 0) { @@ -360,19 +360,19 @@ int main(int argc, const char **argv) } // am i part of the initial quorum? - if (monmap.contains(g_conf->name.get_id())) { + if (monmap.contains(g_conf()->name.get_id())) { // hmm, make sure the ip listed exists on the current host? // maybe later. - } else if (!g_conf->public_addr.is_blank_ip()) { - entity_addr_t a = g_conf->public_addr; + } else if (!g_conf()->public_addr.is_blank_ip()) { + entity_addr_t a = g_conf()->public_addr; if (a.get_port() == 0) a.set_port(CEPH_MON_PORT_LEGACY); if (monmap.contains(a)) { string name; monmap.get_addr_name(a, name); - monmap.rename(name, g_conf->name.get_id()); + monmap.rename(name, g_conf()->name.get_id()); dout(0) << argv[0] << ": renaming mon." << name << " " << a - << " to mon." << g_conf->name.get_id() << dendl; + << " to mon." << g_conf()->name.get_id() << dendl; } } else { // is a local address listed without a name? if so, name myself. @@ -386,8 +386,8 @@ int main(int argc, const char **argv) if (name.compare(0, 7, "noname-") == 0) { dout(0) << argv[0] << ": mon." << name << " " << local - << " is local, renaming to mon." << g_conf->name.get_id() << dendl; - monmap.rename(name, g_conf->name.get_id()); + << " is local, renaming to mon." << g_conf()->name.get_id() << dendl; + monmap.rename(name, g_conf()->name.get_id()); } else { dout(0) << argv[0] << ": mon." << name << " " << local << " is local, but not 'noname-' + something; not assuming it's me" << dendl; @@ -396,7 +396,7 @@ int main(int argc, const char **argv) } } - const auto fsid = g_conf->get_val("fsid"); + const auto fsid = g_conf().get_val("fsid"); if (!fsid.is_zero()) { monmap.fsid = fsid; dout(0) << argv[0] << ": set fsid to " << fsid << dendl; @@ -420,49 +420,49 @@ int main(int argc, const char **argv) } // go - MonitorDBStore store(g_conf->mon_data); + MonitorDBStore store(g_conf()->mon_data); ostringstream oss; int r = store.create_and_open(oss); if (oss.tellp()) derr << oss.str() << dendl; if (r < 0) { derr << argv[0] << ": error opening mon data directory at '" - << g_conf->mon_data << "': " << cpp_strerror(r) << dendl; + << g_conf()->mon_data << "': " << cpp_strerror(r) << dendl; exit(1); } assert(r == 0); - Monitor mon(g_ceph_context, g_conf->name.get_id(), &store, 0, 0, &monmap); + Monitor mon(g_ceph_context, g_conf()->name.get_id(), &store, 0, 0, &monmap); r = mon.mkfs(osdmapbl); if (r < 0) { derr << argv[0] << ": error creating monfs: " << cpp_strerror(r) << dendl; exit(1); } store.close(); - dout(0) << argv[0] << ": created monfs at " << g_conf->mon_data - << " for " << g_conf->name << dendl; + dout(0) << argv[0] << ": created monfs at " << g_conf()->mon_data + << " for " << g_conf()->name << dendl; return 0; } err = check_mon_data_exists(); if (err < 0 && err == -ENOENT) { - derr << "monitor data directory at '" << g_conf->mon_data << "'" + derr << "monitor data directory at '" << g_conf()->mon_data << "'" << " does not exist: have you run 'mkfs'?" << dendl; exit(1); } else if (err < 0) { derr << "error accessing monitor data directory at '" - << g_conf->mon_data << "': " << cpp_strerror(-err) << dendl; + << g_conf()->mon_data << "': " << cpp_strerror(-err) << dendl; exit(1); } err = check_mon_data_empty(); if (err == 0) { - derr << "monitor data directory at '" << g_conf->mon_data + derr << "monitor data directory at '" << g_conf()->mon_data << "' is empty: have you run 'mkfs'?" << dendl; exit(1); } else if (err < 0 && err != -ENOTEMPTY) { // we don't want an empty data dir by now - derr << "error accessing '" << g_conf->mon_data << "': " + derr << "error accessing '" << g_conf()->mon_data << "': " << cpp_strerror(-err) << dendl; exit(1); } @@ -470,18 +470,18 @@ int main(int argc, const char **argv) { // check fs stats. don't start if it's critically close to full. ceph_data_stats_t stats; - int err = get_fs_stats(stats, g_conf->mon_data.c_str()); + int err = get_fs_stats(stats, g_conf()->mon_data.c_str()); if (err < 0) { derr << "error checking monitor data's fs stats: " << cpp_strerror(err) << dendl; exit(-err); } - if (stats.avail_percent <= g_conf->mon_data_avail_crit) { + if (stats.avail_percent <= g_conf()->mon_data_avail_crit) { derr << "error: monitor data filesystem reached concerning levels of" << " available storage space (available: " << stats.avail_percent << "% " << byte_u_t(stats.byte_avail) << ")\nyou may adjust 'mon data avail crit' to a lower value" - << " to make this go away (default: " << g_conf->mon_data_avail_crit + << " to make this go away (default: " << g_conf()->mon_data_avail_crit << "%)\n" << dendl; exit(ENOSPC); } @@ -517,7 +517,7 @@ int main(int argc, const char **argv) init_async_signal_handler(); register_async_signal_handler(SIGHUP, sighup_handler); - MonitorDBStore *store = new MonitorDBStore(g_conf->mon_data); + MonitorDBStore *store = new MonitorDBStore(g_conf()->mon_data); { ostringstream oss; err = store->open(oss); @@ -525,7 +525,7 @@ int main(int argc, const char **argv) derr << oss.str() << dendl; if (err < 0) { derr << "error opening mon data directory at '" - << g_conf->mon_data << "': " << cpp_strerror(err) << dendl; + << g_conf()->mon_data << "': " << cpp_strerror(err) << dendl; prefork.exit(1); } } @@ -621,15 +621,15 @@ int main(int argc, const char **argv) // this is what i will bind to entity_addr_t ipaddr; - if (monmap.contains(g_conf->name.get_id())) { - ipaddr = monmap.get_addr(g_conf->name.get_id()); + if (monmap.contains(g_conf()->name.get_id())) { + ipaddr = monmap.get_addr(g_conf()->name.get_id()); // print helpful warning if the conf file doesn't match entity_addr_t conf_addr; std::vector my_sections; - g_conf->get_my_sections(my_sections); + g_conf().get_my_sections(my_sections); std::string mon_addr_str; - if (g_conf->get_val_from_conf_file(my_sections, "mon addr", + if (g_conf().get_val_from_conf_file(my_sections, "mon addr", mon_addr_str, true) == 0) { if (conf_addr.parse(mon_addr_str.c_str())) { if (conf_addr.get_port() == 0) @@ -644,14 +644,14 @@ int main(int argc, const char **argv) << " continuing with monmap configuration" << dendl; } } else { - dout(0) << g_conf->name << " does not exist in monmap, will attempt to join an existing cluster" << dendl; + dout(0) << g_conf()->name << " does not exist in monmap, will attempt to join an existing cluster" << dendl; pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_PUBLIC); - if (!g_conf->public_addr.is_blank_ip()) { - ipaddr = g_conf->public_addr; + if (!g_conf()->public_addr.is_blank_ip()) { + ipaddr = g_conf()->public_addr; if (ipaddr.get_port() == 0) ipaddr.set_port(CEPH_MON_PORT_LEGACY); - dout(0) << "using public_addr " << g_conf->public_addr << " -> " + dout(0) << "using public_addr " << g_conf()->public_addr << " -> " << ipaddr << dendl; } else { MonMap tmpmap; @@ -664,10 +664,10 @@ int main(int argc, const char **argv) << cpp_strerror(err) << dendl; prefork.exit(1); } - if (tmpmap.contains(g_conf->name.get_id())) { - ipaddr = tmpmap.get_addr(g_conf->name.get_id()); + if (tmpmap.contains(g_conf()->name.get_id())) { + ipaddr = tmpmap.get_addr(g_conf()->name.get_id()); } else { - derr << "no public_addr or public_network specified, and " << g_conf->name + derr << "no public_addr or public_network specified, and " << g_conf()->name << " not present in monmap or ceph.conf" << dendl; prefork.exit(1); } @@ -675,8 +675,8 @@ int main(int argc, const char **argv) } // bind - int rank = monmap.get_rank(g_conf->name.get_id()); - std::string public_msgr_type = g_conf->ms_public_type.empty() ? g_conf->get_val("ms_type") : g_conf->ms_public_type; + int rank = monmap.get_rank(g_conf()->name.get_id()); + std::string public_msgr_type = g_conf()->ms_public_type.empty() ? g_conf().get_val("ms_type") : g_conf()->ms_public_type; Messenger *msgr = Messenger::create(g_ceph_context, public_msgr_type, entity_name_t::MON(rank), "mon", 0, Messenger::HAS_MANY_CONNECTIONS); @@ -699,7 +699,7 @@ int main(int argc, const char **argv) // throttle client traffic Throttle *client_throttler = new Throttle(g_ceph_context, "mon_client_bytes", - g_conf->mon_client_bytes); + g_conf()->mon_client_bytes); msgr->set_policy_throttlers(entity_name_t::TYPE_CLIENT, client_throttler, NULL); @@ -707,7 +707,7 @@ int main(int argc, const char **argv) // NOTE: actual usage on the leader may multiply by the number of // monitors if they forward large update messages from daemons. Throttle *daemon_throttler = new Throttle(g_ceph_context, "mon_daemon_bytes", - g_conf->mon_daemon_bytes); + g_conf()->mon_daemon_bytes); msgr->set_policy_throttlers(entity_name_t::TYPE_OSD, daemon_throttler, NULL); msgr->set_policy_throttlers(entity_name_t::TYPE_MDS, daemon_throttler, @@ -717,8 +717,8 @@ int main(int argc, const char **argv) entity_addr_t public_addr = ipaddr; // check if the public_bind_addr option is set - if (!g_conf->public_bind_addr.is_blank_ip()) { - bind_addr = g_conf->public_bind_addr; + if (!g_conf()->public_bind_addr.is_blank_ip()) { + bind_addr = g_conf()->public_bind_addr; // set the default port if not already set if (bind_addr.get_port() == 0) { @@ -726,10 +726,10 @@ int main(int argc, const char **argv) } } - dout(0) << "starting " << g_conf->name << " rank " << rank + dout(0) << "starting " << g_conf()->name << " rank " << rank << " at public addr " << public_addr << " at bind addr " << bind_addr - << " mon_data " << g_conf->mon_data + << " mon_data " << g_conf()->mon_data << " fsid " << monmap.get_fsid() << dendl; @@ -753,14 +753,14 @@ int main(int argc, const char **argv) prefork.exit(1); } - dout(0) << "starting " << g_conf->name << " rank " << rank + dout(0) << "starting " << g_conf()->name << " rank " << rank << " at " << ipaddr - << " mon_data " << g_conf->mon_data + << " mon_data " << g_conf()->mon_data << " fsid " << monmap.get_fsid() << dendl; // start monitor - mon = new Monitor(g_ceph_context, g_conf->name.get_id(), store, + mon = new Monitor(g_ceph_context, g_conf()->name.get_id(), store, msgr, mgr_msgr, &monmap); if (force_sync) { @@ -777,13 +777,13 @@ int main(int argc, const char **argv) prefork.exit(1); } - if (compact || g_conf->mon_compact_on_start) { + if (compact || g_conf()->mon_compact_on_start) { derr << "compacting monitor store ..." << dendl; mon->store->compact(); derr << "done compacting" << dendl; } - if (g_conf->daemonize) { + if (g_conf()->daemonize) { global_init_postfork_finish(g_ceph_context); prefork.daemonize(); } @@ -796,7 +796,7 @@ int main(int argc, const char **argv) register_async_signal_handler_oneshot(SIGINT, handle_mon_signal); register_async_signal_handler_oneshot(SIGTERM, handle_mon_signal); - if (g_conf->inject_early_sigterm) + if (g_conf()->inject_early_sigterm) kill(getpid(), SIGTERM); msgr->wait(); diff --git a/src/ceph_osd.cc b/src/ceph_osd.cc index 3e2b67c0f915d..86c5e7aea4b8c 100644 --- a/src/ceph_osd.cc +++ b/src/ceph_osd.cc @@ -207,7 +207,7 @@ int main(int argc, const char **argv) global_init_chdir(g_ceph_context); if (get_journal_fsid) { - device_path = g_conf->get_val("osd_journal"); + device_path = g_conf().get_val("osd_journal"); get_device_fsid = true; } if (get_device_fsid) { @@ -250,9 +250,9 @@ int main(int argc, const char **argv) // whoami char *end; - const char *id = g_conf->name.get_id().c_str(); + const char *id = g_conf()->name.get_id().c_str(); int whoami = strtol(id, &end, 10); - std::string data_path = g_conf->get_val("osd_data"); + std::string data_path = g_conf().get_val("osd_data"); if (*end || end == id || whoami < 0) { derr << "must specify '-i #' where # is the osd number" << dendl; forker.exit(1); @@ -264,7 +264,7 @@ int main(int argc, const char **argv) } // the store - std::string store_type = g_conf->get_val("osd_objectstore"); + std::string store_type = g_conf().get_val("osd_objectstore"); { char fn[PATH_MAX]; snprintf(fn, sizeof(fn), "%s/type", data_path.c_str()); @@ -280,8 +280,8 @@ int main(int argc, const char **argv) } } - std::string journal_path = g_conf->get_val("osd_journal"); - uint32_t flags = g_conf->get_val("osd_os_flags"); + std::string journal_path = g_conf().get_val("osd_journal"); + uint32_t flags = g_conf().get_val("osd_os_flags"); ObjectStore *store = ObjectStore::create(g_ceph_context, store_type, data_path, @@ -301,10 +301,10 @@ int main(int argc, const char **argv) forker.exit(1); } - EntityName ename(g_conf->name); + EntityName ename{g_conf()->name}; EntityAuth eauth; - std::string keyring_path = g_conf->get_val("keyring"); + std::string keyring_path = g_conf().get_val("keyring"); int ret = keyring->load(g_ceph_context, keyring_path); if (ret == 0 && keyring->get_auth(ename, eauth)) { @@ -326,13 +326,13 @@ int main(int argc, const char **argv) if (mkfs) { common_init_finish(g_ceph_context); - if (g_conf->get_val("fsid").is_zero()) { + if (g_conf().get_val("fsid").is_zero()) { derr << "must specify cluster fsid" << dendl; forker.exit(-EINVAL); } int err = OSD::mkfs(g_ceph_context, store, data_path, - g_conf->get_val("fsid"), + g_conf().get_val("fsid"), whoami); if (err < 0) { derr << TEXT_RED << " ** ERROR: error creating empty object store in " @@ -341,7 +341,7 @@ int main(int argc, const char **argv) } dout(0) << "created object store " << data_path << " for osd." << whoami - << " fsid " << g_conf->get_val("fsid") + << " fsid " << g_conf().get_val("fsid") << dendl; } if (mkfs || mkkey) { @@ -470,11 +470,11 @@ flushjournal_out: forker.exit(0); } - std::string msg_type = g_conf->get_val("ms_type"); + std::string msg_type = g_conf().get_val("ms_type"); std::string public_msg_type = - g_conf->get_val("ms_public_type"); + g_conf().get_val("ms_public_type"); std::string cluster_msg_type = - g_conf->get_val("ms_cluster_type"); + g_conf().get_val("ms_cluster_type"); public_msg_type = public_msg_type.empty() ? msg_type : public_msg_type; cluster_msg_type = cluster_msg_type.empty() ? msg_type : cluster_msg_type; @@ -518,7 +518,7 @@ flushjournal_out: << std::endl; uint64_t message_size = - g_conf->get_val("osd_client_message_size_cap"); + g_conf().get_val("osd_client_message_size_cap"); boost::scoped_ptr client_byte_throttler( new Throttle(g_ceph_context, "osd_client_bytes", message_size)); @@ -569,7 +569,7 @@ flushjournal_out: if (ms_cluster->bindv(cluster_addrs) < 0) forker.exit(1); - bool is_delay = g_conf->get_val("osd_heartbeat_use_min_delay_socket"); + bool is_delay = g_conf().get_val("osd_heartbeat_use_min_delay_socket"); if (is_delay) { ms_hb_front_client->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY); ms_hb_back_client->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY); @@ -655,7 +655,7 @@ flushjournal_out: // -- daemonize -- - if (g_conf->daemonize) { + if (g_conf()->daemonize) { global_init_postfork_finish(g_ceph_context); forker.daemonize(); } @@ -666,7 +666,7 @@ flushjournal_out: osd->final_init(); - if (g_conf->get_val("inject_early_sigterm")) + if (g_conf().get_val("inject_early_sigterm")) kill(getpid(), SIGTERM); ms_public->wait(); diff --git a/src/ceph_syn.cc b/src/ceph_syn.cc index 490a30d6e5b88..50e26f2815a00 100644 --- a/src/ceph_syn.cc +++ b/src/ceph_syn.cc @@ -63,7 +63,7 @@ int main(int argc, const char **argv, char *envp[]) for (int i=0; ibind(g_conf->public_addr); + messengers[i]->bind(g_conf()->public_addr); mclients[i] = new MonClient(g_ceph_context); mclients[i]->build_initial_monmap(); auto client = new StandaloneClient(messengers[i], mclients[i]); diff --git a/src/client/Client.cc b/src/client/Client.cc index 4fdf276b2d396..1e351daaab89a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -484,7 +484,7 @@ void Client::_finish_init() client_lock.Unlock(); - cct->_conf->add_observer(this); + cct->_conf.add_observer(this); AdminSocket* admin_socket = cct->get_admin_socket(); int ret = admin_socket->register_command("mds_requests", @@ -543,7 +543,7 @@ void Client::shutdown() _close_sessions(); client_lock.Unlock(); - cct->_conf->remove_observer(this); + cct->_conf.remove_observer(this); cct->get_admin_socket()->unregister_commands(&m_command_hook); @@ -4021,8 +4021,8 @@ int Client::_do_remount(void) "failed to remount (to trim kernel dentries): " "return code = " << r << dendl; } - bool should_abort = cct->_conf->get_val("client_die_on_failed_remount") || - cct->_conf->get_val("client_die_on_failed_dentry_invalidate"); + bool should_abort = cct->_conf.get_val("client_die_on_failed_remount") || + cct->_conf.get_val("client_die_on_failed_dentry_invalidate"); if (should_abort && !unmounting) { lderr(cct) << "failed to remount for kernel dentry trimming; quitting!" << dendl; ceph_abort(); @@ -5962,8 +5962,8 @@ void Client::tick() { if (cct->_conf->client_debug_inject_tick_delay > 0) { sleep(cct->_conf->client_debug_inject_tick_delay); - assert(0 == cct->_conf->set_val("client_debug_inject_tick_delay", "0")); - cct->_conf->apply_changes(NULL); + assert(0 == cct->_conf.set_val("client_debug_inject_tick_delay", "0")); + cct->_conf.apply_changes(NULL); } ldout(cct, 21) << "tick" << dendl; @@ -8382,7 +8382,7 @@ Fh *Client::_create_fh(Inode *in, int flags, int cmode, const UserPerm& perms) << ccap_string(in->caps_issued()) << dendl; } - const md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; f->readahead.set_trigger_requests(1); f->readahead.set_min_readahead_size(conf->client_readahead_min); uint64_t max_readahead = Readahead::NO_LIMIT; @@ -8759,7 +8759,7 @@ int64_t Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl) bool movepos = false; std::unique_ptr onuninline; int64_t r = 0; - const md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; Inode *in = f->inode.get(); if ((f->mode & CEPH_FILE_MODE_RD) == 0) @@ -8901,7 +8901,7 @@ void Client::C_Readahead::finish(int r) { int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl) { - const md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; Inode *in = f->inode.get(); ldout(cct, 10) << __func__ << " " << *in << " " << off << "~" << len << dendl; @@ -10072,7 +10072,7 @@ int Client::test_dentry_handling(bool can_invalidate) r = _do_remount(); } if (r) { - bool should_abort = cct->_conf->get_val("client_die_on_failed_dentry_invalidate"); + bool should_abort = cct->_conf.get_val("client_die_on_failed_dentry_invalidate"); if (should_abort) { lderr(cct) << "no method to invalidate kernel dentry cache; quitting!" << dendl; ceph_abort(); @@ -10290,7 +10290,7 @@ int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr, return -ENOTCONN; int r = 0; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { if (strcmp(name, ".") && strcmp(name, "..")) { @@ -10380,7 +10380,7 @@ int Client::ll_lookupx(Inode *parent, const char *name, Inode **out, return -ENOTCONN; int r = 0; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { r = may_lookup(parent, perms); @@ -10652,7 +10652,7 @@ int Client::_ll_setattrx(Inode *in, struct ceph_statx *stx, int mask, tout(cct) << stx->stx_btime << std::endl; tout(cct) << mask << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int res = may_setattr(in, stx, mask, perms); @@ -10979,7 +10979,7 @@ int Client::ll_getxattr(Inode *in, const char *name, void *value, tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_READ, perms); @@ -11250,7 +11250,7 @@ int Client::ll_setxattr(Inode *in, const char *name, const void *value, tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_WRITE, perms); @@ -11316,7 +11316,7 @@ int Client::ll_removexattr(Inode *in, const char *name, const UserPerm& perms) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_WRITE, perms); @@ -11655,7 +11655,7 @@ int Client::ll_mknod(Inode *parent, const char *name, mode_t mode, tout(cct) << mode << std::endl; tout(cct) << rdev << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perms); @@ -11696,7 +11696,7 @@ int Client::ll_mknodx(Inode *parent, const char *name, mode_t mode, tout(cct) << mode << std::endl; tout(cct) << rdev << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perms); @@ -11883,7 +11883,7 @@ int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode, tout(cct) << name << std::endl; tout(cct) << mode << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perm); @@ -11921,7 +11921,7 @@ int Client::ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out, tout(cct) << name << std::endl; tout(cct) << mode << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perms); @@ -12008,7 +12008,7 @@ int Client::ll_symlink(Inode *parent, const char *name, const char *value, tout(cct) << name << std::endl; tout(cct) << value << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perms); @@ -12047,7 +12047,7 @@ int Client::ll_symlinkx(Inode *parent, const char *name, const char *value, tout(cct) << name << std::endl; tout(cct) << value << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_create(parent, perms); @@ -12132,7 +12132,7 @@ int Client::ll_unlink(Inode *in, const char *name, const UserPerm& perm) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_delete(in, name, perm); @@ -12209,7 +12209,7 @@ int Client::ll_rmdir(Inode *in, const char *name, const UserPerm& perms) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_delete(in, name, perms); @@ -12346,7 +12346,7 @@ int Client::ll_rename(Inode *parent, const char *name, Inode *newparent, tout(cct) << vnewparent.ino.val << std::endl; tout(cct) << newname << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_delete(parent, name, perm); @@ -12425,7 +12425,7 @@ int Client::ll_link(Inode *in, Inode *newparent, const char *newname, InodeRef target; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { if (S_ISDIR(in->mode)) @@ -12556,7 +12556,7 @@ int Client::ll_opendir(Inode *in, int flags, dir_result_t** dirpp, tout(cct) << "ll_opendir" << std::endl; tout(cct) << vino.ino.val << std::endl; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { int r = may_open(in, flags, perms); @@ -12616,7 +12616,7 @@ int Client::ll_open(Inode *in, int flags, Fh **fhp, const UserPerm& perms) tout(cct) << ceph_flags_sys2wire(flags) << std::endl; int r; - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { r = may_open(in, flags, perms); @@ -12661,7 +12661,7 @@ int Client::_ll_create(Inode *parent, const char *name, mode_t mode, return -EEXIST; if (r == -ENOENT && (flags & O_CREAT)) { - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { r = may_create(parent, perms); @@ -12681,7 +12681,7 @@ int Client::_ll_create(Inode *parent, const char *name, mode_t mode, ldout(cct, 20) << "_ll_create created = " << created << dendl; if (!created) { - auto fuse_default_permissions = cct->_conf->get_val( + auto fuse_default_permissions = cct->_conf.get_val( "fuse_default_permissions"); if (!fuse_default_permissions) { r = may_open(in->get(), flags, perms); @@ -13592,7 +13592,7 @@ void Client::ms_handle_remote_reset(Connection *con) case MetaSession::STATE_OPEN: { objecter->maybe_request_map(); /* to check if we are blacklisted */ - const md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; if (conf->client_reconnect_stale) { ldout(cct, 1) << "reset from mds we were open; close mds session for reconnect" << dendl; _closed_mds_session(s); diff --git a/src/common/HeartbeatMap.cc b/src/common/HeartbeatMap.cc index 62a703f911459..cfd8779440abd 100644 --- a/src/common/HeartbeatMap.cc +++ b/src/common/HeartbeatMap.cc @@ -123,7 +123,7 @@ bool HeartbeatMap::is_healthy() if (m_cct->_conf->heartbeat_inject_failure) { ldout(m_cct, 0) << "is_healthy injecting failure for next " << m_cct->_conf->heartbeat_inject_failure << " seconds" << dendl; m_inject_unhealthy_until = now + std::chrono::seconds(m_cct->_conf->heartbeat_inject_failure); - m_cct->_conf->set_val("heartbeat_inject_failure", "0"); + m_cct->_conf.set_val("heartbeat_inject_failure", "0"); } bool healthy = true; diff --git a/src/common/LogClient.cc b/src/common/LogClient.cc index bff6d71859cd0..8702d71f0e5dd 100644 --- a/src/common/LogClient.cc +++ b/src/common/LogClient.cc @@ -84,7 +84,7 @@ int parse_log_client_options(CephContext *cct, return r; } - fsid = cct->_conf->get_val("fsid"); + fsid = cct->_conf.get_val("fsid"); host = cct->_conf->host; return 0; } diff --git a/src/common/PluginRegistry.cc b/src/common/PluginRegistry.cc index 1c12c2a46d72b..bf63634e2fd8d 100644 --- a/src/common/PluginRegistry.cc +++ b/src/common/PluginRegistry.cc @@ -140,13 +140,13 @@ int PluginRegistry::load(const std::string &type, // std::string fname = cct->_conf->plugin_dir + "/" + type + "/" PLUGIN_PREFIX // + name + PLUGIN_SUFFIX; - std::string fname = cct->_conf->get_val("plugin_dir") + "/" + type + "/" + PLUGIN_PREFIX + std::string fname = cct->_conf.get_val("plugin_dir") + "/" + type + "/" + PLUGIN_PREFIX + name + PLUGIN_SUFFIX; void *library = dlopen(fname.c_str(), RTLD_NOW); if (!library) { string err1(dlerror()); // fall back to plugin_dir - std::string fname2 = cct->_conf->get_val("plugin_dir") + "/" + PLUGIN_PREFIX + + std::string fname2 = cct->_conf.get_val("plugin_dir") + "/" + PLUGIN_PREFIX + name + PLUGIN_SUFFIX; library = dlopen(fname2.c_str(), RTLD_NOW); if (!library) { diff --git a/src/common/TracepointProvider.cc b/src/common/TracepointProvider.cc index 62ae60bbb4687..fbc7b22a4713c 100644 --- a/src/common/TracepointProvider.cc +++ b/src/common/TracepointProvider.cc @@ -8,12 +8,12 @@ TracepointProvider::TracepointProvider(CephContext *cct, const char *library, const char *config_key) : m_cct(cct), m_library(library), m_config_keys{config_key, NULL}, m_lock("TracepointProvider::m_lock") { - m_cct->_conf->add_observer(this); + m_cct->_conf.add_observer(this); verify_config(m_cct->_conf); } TracepointProvider::~TracepointProvider() { - m_cct->_conf->remove_observer(this); + m_cct->_conf.remove_observer(this); if (m_handle) { dlclose(m_handle); } @@ -22,11 +22,11 @@ TracepointProvider::~TracepointProvider() { void TracepointProvider::handle_conf_change( const md_config_t *conf, const std::set &changed) { if (changed.count(m_config_keys[0])) { - verify_config(conf); + verify_config(ConfigProxy{conf}); } } -void TracepointProvider::verify_config(const md_config_t *conf) { +void TracepointProvider::verify_config(const ConfigProxy& conf) { Mutex::Locker locker(m_lock); if (m_handle) { return; @@ -34,7 +34,7 @@ void TracepointProvider::verify_config(const md_config_t *conf) { char buf[10]; char *pbuf = buf; - if (conf->get_val(m_config_keys[0], &pbuf, sizeof(buf)) != 0 || + if (conf.get_val(m_config_keys[0], &pbuf, sizeof(buf)) != 0 || strncmp(buf, "true", 5) != 0) { return; } diff --git a/src/common/TracepointProvider.h b/src/common/TracepointProvider.h index a53a904256cd3..d0ff8c949710b 100644 --- a/src/common/TracepointProvider.h +++ b/src/common/TracepointProvider.h @@ -76,7 +76,7 @@ private: Mutex m_lock; void* m_handle = nullptr; - void verify_config(const md_config_t *conf); + void verify_config(const ConfigProxy& conf); }; #endif // CEPH_TRACEPOINT_PROVIDER_H diff --git a/src/common/WorkQueue.cc b/src/common/WorkQueue.cc index 2a4528fa82c04..24cb697b83ef4 100644 --- a/src/common/WorkQueue.cc +++ b/src/common/WorkQueue.cc @@ -183,7 +183,7 @@ void ThreadPool::start() if (_thread_num_option.length()) { ldout(cct, 10) << " registering config observer on " << _thread_num_option << dendl; - cct->_conf->add_observer(this); + cct->_conf.add_observer(this); } _lock.Lock(); @@ -198,7 +198,7 @@ void ThreadPool::stop(bool clear_after) if (_thread_num_option.length()) { ldout(cct, 10) << " unregistering config observer on " << _thread_num_option << dendl; - cct->_conf->remove_observer(this); + cct->_conf.remove_observer(this); } _lock.Lock(); diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index 1555f52f0b302..5461e54991cba 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -63,10 +63,10 @@ public: void handle_conf_change(const md_config_t *conf, const std::set &changed) override { - if (conf->lockdep && !m_registered) { + if (conf->values.lockdep && !m_registered) { lockdep_register_ceph_context(m_cct); m_registered = true; - } else if (!conf->lockdep && m_registered) { + } else if (!conf->values.lockdep && m_registered) { lockdep_unregister_ceph_context(m_cct); m_registered = false; } @@ -82,7 +82,7 @@ class MempoolObs : public md_config_obs_t, public: explicit MempoolObs(CephContext *cct) : cct(cct) { - cct->_conf->add_observer(this); + cct->_conf.add_observer(this); int r = cct->get_admin_socket()->register_command( "dump_mempools", "dump_mempools", @@ -91,7 +91,7 @@ public: assert(r == 0); } ~MempoolObs() override { - cct->_conf->remove_observer(this); + cct->_conf.remove_observer(this); cct->get_admin_socket()->unregister_command("dump_mempools"); } @@ -224,8 +224,9 @@ public: return KEYS; } - void handle_conf_change(const md_config_t *conf, + void handle_conf_change(const md_config_t *mconf, const std::set &changed) override { + ConfigReader conf{mconf}; // stderr if (changed.count("log_to_stderr") || changed.count("err_to_stderr")) { int l = conf->log_to_stderr ? 99 : (conf->err_to_stderr ? -1 : -2); @@ -245,7 +246,7 @@ public: } if (changed.count("log_stderr_prefix")) { - log->set_log_stderr_prefix(conf->get_val("log_stderr_prefix")); + log->set_log_stderr_prefix(conf.get_val("log_stderr_prefix")); } if (changed.count("log_max_new")) { @@ -274,7 +275,7 @@ public: } if (changed.find("log_coarse_timestamps") != changed.end()) { - log->set_coarse_timestamps(conf->get_val("log_coarse_timestamps")); + log->set_coarse_timestamps(conf.get_val("log_coarse_timestamps")); } // metadata @@ -283,7 +284,7 @@ public: } if (log->graylog() && changed.count("fsid")) { - log->graylog()->set_fsid(conf->get_val("fsid")); + log->graylog()->set_fsid(conf.get_val("fsid")); } } }; @@ -305,10 +306,11 @@ public: return KEYS; } - void handle_conf_change(const md_config_t *conf, + void handle_conf_change(const md_config_t *mconf, const std::set &changed) override { if (changed.count( "enable_experimental_unrecoverable_data_corrupting_features")) { + ConfigReader conf{mconf}; std::lock_guard lg(cct->_feature_lock); get_str_set( conf->enable_experimental_unrecoverable_data_corrupting_features, @@ -441,20 +443,20 @@ void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap, boost::replace_all(section, " ", "_"); f->open_object_section(section.c_str()); if (command == "config show") { - _conf->show_config(f); + _conf.show_config(f); } else if (command == "config unset") { std::string var; if (!(cmd_getval(this, cmdmap, "var", var))) { f->dump_string("error", "syntax error: 'config unset '"); } else { - int r = _conf->rm_val(var.c_str()); + int r = _conf.rm_val(var.c_str()); if (r < 0 && r != -ENOENT) { f->dump_stream("error") << "error unsetting '" << var << "': " << cpp_strerror(r); } else { ostringstream ss; - _conf->apply_changes(&ss); + _conf.apply_changes(&ss); f->dump_string("success", ss.str()); } } @@ -470,12 +472,12 @@ void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap, } else { // val may be multiple words string valstr = str_join(val, " "); - int r = _conf->set_val(var.c_str(), valstr.c_str()); + int r = _conf.set_val(var.c_str(), valstr.c_str()); if (r < 0) { f->dump_stream("error") << "error setting '" << var << "' to '" << valstr << "': " << cpp_strerror(r); } else { ostringstream ss; - _conf->apply_changes(&ss); + _conf.apply_changes(&ss); f->dump_string("success", ss.str()); } } @@ -487,7 +489,7 @@ void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap, char buf[4096]; memset(buf, 0, sizeof(buf)); char *tmp = buf; - int r = _conf->get_val(var.c_str(), &tmp, sizeof(buf)); + int r = _conf.get_val(var.c_str(), &tmp, sizeof(buf)); if (r < 0) { f->dump_stream("error") << "error getting '" << var << "': " << cpp_strerror(r); } else { @@ -499,13 +501,13 @@ void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap, if (cmd_getval(this, cmdmap, "var", var)) { // Output a single one std::string key = ConfFile::normalize_key_name(var); - const auto &i = _conf->schema.find(key); - if (i == _conf->schema.end()) { + auto schema = _conf.get_schema(key); + if (!schema) { std::ostringstream msg; msg << "Setting not found: '" << key << "'"; f->dump_string("error", msg.str()); } else { - f->dump_object("option", i->second); + f->dump_object("option", *schema); } } else { // Output all @@ -517,12 +519,12 @@ void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap, } } else if (command == "config diff") { f->open_object_section("diff"); - _conf->diff(f); + _conf.diff(f); f->close_section(); // unknown } else if (command == "config diff get") { std::string setting; f->open_object_section("diff"); - _conf->diff(f, setting); + _conf.diff(f, setting); f->close_section(); // unknown } else if (command == "log flush") { _log->flush(); @@ -548,7 +550,7 @@ CephContext::CephContext(uint32_t module_type_, enum code_environment_t code_env, int init_flags_) : nref(1), - _conf(new md_config_t(code_env == CODE_ENVIRONMENT_DAEMON)), + _conf{code_env == CODE_ENVIRONMENT_DAEMON}, _log(NULL), _module_type(module_type_), _init_flags(init_flags_), @@ -574,13 +576,13 @@ CephContext::CephContext(uint32_t module_type_, _log->start(); _log_obs = new LogObs(_log); - _conf->add_observer(_log_obs); + _conf.add_observer(_log_obs); _cct_obs = new CephContextObs(this); - _conf->add_observer(_cct_obs); + _conf.add_observer(_cct_obs); _lockdep_obs = new LockdepObs(this); - _conf->add_observer(_lockdep_obs); + _conf.add_observer(_lockdep_obs); _perf_counters_collection = new PerfCountersCollection(this); @@ -648,15 +650,15 @@ CephContext::~CephContext() delete _perf_counters_conf_obs; _perf_counters_conf_obs = NULL; - _conf->remove_observer(_log_obs); + _conf.remove_observer(_log_obs); delete _log_obs; _log_obs = NULL; - _conf->remove_observer(_cct_obs); + _conf.remove_observer(_cct_obs); delete _cct_obs; _cct_obs = NULL; - _conf->remove_observer(_lockdep_obs); + _conf.remove_observer(_lockdep_obs); delete _lockdep_obs; _lockdep_obs = NULL; @@ -664,8 +666,6 @@ CephContext::~CephContext() delete _log; _log = NULL; - delete _conf; - delete _crypto_none; delete _crypto_aes; if (_crypto_inited > 0) { @@ -716,8 +716,8 @@ void CephContext::start_service_thread() // Trigger callbacks on any config observers that were waiting for // it to become safe to start threads. - _conf->set_safe_to_start_threads(); - _conf->call_all_observers(); + _conf.set_safe_to_start_threads(); + _conf.call_all_observers(); // start admin socket if (_conf->admin_socket.length()) diff --git a/src/common/ceph_context.h b/src/common/ceph_context.h index 08ba1ba9c6855..0c2c64878715a 100644 --- a/src/common/ceph_context.h +++ b/src/common/ceph_context.h @@ -29,7 +29,7 @@ #include "common/cmdparse.h" #include "common/code_environment.h" -#include "common/config_fwd.h" +#include "common/config_proxy.h" #include "include/spinlock.h" @@ -83,7 +83,7 @@ public: } void put(); - md_config_t *_conf; + ConfigProxy _conf; ceph::logging::Log *_log; /* init ceph::crypto */ diff --git a/src/common/common_init.cc b/src/common/common_init.cc index 1c306d3b98c4b..7799165e763a4 100644 --- a/src/common/common_init.cc +++ b/src/common/common_init.cc @@ -36,7 +36,7 @@ CephContext *common_preinit(const CephInitParameters &iparams, // Create a configuration object CephContext *cct = new CephContext(iparams.module_type, code_env, flags); - md_config_t *conf = cct->_conf; + auto& conf = cct->_conf; // add config observers here // Set up our entity name. @@ -46,26 +46,26 @@ CephContext *common_preinit(const CephInitParameters &iparams, // for backward compatibility. moving forward, we want all keyrings // in these locations. the mon already forces $mon_data/keyring. if (conf->name.is_mds()) { - conf->set_val_default("keyring", "$mds_data/keyring"); + conf.set_val_default("keyring", "$mds_data/keyring"); } else if (conf->name.is_osd()) { - conf->set_val_default("keyring", "$osd_data/keyring"); + conf.set_val_default("keyring", "$osd_data/keyring"); } if ((flags & CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS)) { // make this unique despite multiple instances by the same name. - conf->set_val_default("admin_socket", + conf.set_val_default("admin_socket", "$run_dir/$cluster-$name.$pid.$cctid.asok"); } if (code_env == CODE_ENVIRONMENT_LIBRARY || code_env == CODE_ENVIRONMENT_UTILITY_NODOUT) { - conf->set_val_default("log_to_stderr", "false"); - conf->set_val_default("err_to_stderr", "false"); - conf->set_val_default("log_flush_on_exit", "false"); + conf.set_val_default("log_to_stderr", "false"); + conf.set_val_default("err_to_stderr", "false"); + conf.set_val_default("log_flush_on_exit", "false"); } if (code_env != CODE_ENVIRONMENT_DAEMON) { // NOTE: disable ms subsystem gathering in clients by default - conf->set_val_default("debug_ms", "0/0"); + conf.set_val_default("debug_ms", "0/0"); } return cct; @@ -113,7 +113,7 @@ void common_init_finish(CephContext *cct) cct->get_admin_socket()->chown(cct->get_set_uid(), cct->get_set_gid()); } - md_config_t *conf = cct->_conf; + const auto& conf = cct->_conf; if (!conf->admin_socket.empty() && !conf->admin_socket_mode.empty()) { int ret = 0; diff --git a/src/common/config.cc b/src/common/config.cc index d9ed6fc7b6422..ec0690682f490 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -102,7 +102,6 @@ namespace ceph::internal { template md_config_impl::md_config_impl(bool is_daemon) : is_daemon(is_daemon), - cluster(""), lock("md_config_t", true, false) { // Load the compile-time list of Option into @@ -120,15 +119,15 @@ md_config_impl::md_config_impl(bool is_daemon) } // Define the debug_* options as well. - subsys_options.reserve(subsys.get_num()); - for (unsigned i = 0; i < subsys.get_num(); ++i) { - string name = string("debug_") + subsys.get_name(i); + subsys_options.reserve(values.subsys.get_num()); + for (unsigned i = 0; i < values.subsys.get_num(); ++i) { + string name = string("debug_") + values.subsys.get_name(i); subsys_options.push_back( Option(name, Option::TYPE_STR, Option::LEVEL_ADVANCED)); Option& opt = subsys_options.back(); - opt.set_default(stringify(subsys.get_log_level(i)) + "/" + - stringify(subsys.get_gather_level(i))); - string desc = string("Debug level for ") + subsys.get_name(i); + opt.set_default(stringify(values.subsys.get_log_level(i)) + "/" + + stringify(values.subsys.get_gather_level(i))); + string desc = string("Debug level for ") + values.subsys.get_name(i); opt.set_description(desc.c_str()); opt.set_flag(Option::FLAG_RUNTIME); opt.set_long_description("The value takes the form 'N' or 'N/M' where N and M are values between 0 and 99. N is the debug level to log (all values below this are included), and M is the level to gather and buffer in memory. In the event of a crash, the most recent items <= M are dumped to the log file."); @@ -169,7 +168,7 @@ md_config_impl::md_config_impl(bool is_daemon) // members if present. legacy_values = { #define OPTION(name, type) \ - {std::string(STRINGIFY(name)), &md_config_impl::name}, + {std::string(STRINGIFY(name)), &ConfigValues::name}, #define SAFE_OPTION(name, type) OPTION(name, type) #include "common/legacy_config_opts.h" #undef OPTION @@ -312,17 +311,19 @@ int md_config_impl::set_mon_vals(CephContext *cct, ceph_abort(); } } - for (const auto& [name,configs] : values) { - auto j = configs.find(CONF_MON); - if (j != configs.end()) { - if (kv.find(name) == kv.end()) { - ldout(cct,10) << __func__ << " " << name - << " cleared (was " << Option::to_str(j->second) << ")" - << dendl; - _rm_val(name, CONF_MON); - } + values.for_each([&] (auto name, auto configs) { + auto config = configs.find(CONF_MON); + if (config == configs.end()) { + return; } - } + if (kv.find(name) != kv.end()) { + return; + } + ldout(cct,10) << __func__ << " " << name + << " cleared (was " << Option::to_str(config->second) << ")" + << dendl; + values.rm_val(name, CONF_MON); + }); values_bl.clear(); _apply_changes(nullptr); return 0; @@ -365,12 +366,12 @@ int md_config_impl::parse_config_files(const char *conf_files_str, if (safe_to_start_threads) return -ENOSYS; - if (!cluster.size() && !conf_files_str) { + if (!values.cluster.size() && !conf_files_str) { /* * set the cluster name to 'ceph' when neither cluster name nor * configuration file are specified. */ - cluster = "ceph"; + values.cluster = "ceph"; } if (!conf_files_str) { @@ -416,7 +417,7 @@ int md_config_impl::parse_config_files(const char *conf_files_str, if (c == conf_files.end()) return -ENOENT; - if (cluster.size() == 0) { + if (values.cluster.size() == 0) { /* * If cluster name is not set yet, use the prefix of the * basename of configuration file as cluster name. @@ -429,9 +430,9 @@ int md_config_impl::parse_config_files(const char *conf_files_str, * convention, we do the last try and assign the cluster to * 'ceph'. */ - cluster = "ceph"; + values.cluster = "ceph"; } else { - cluster = c->substr(start, end - start); + values.cluster = c->substr(start, end - start); } } @@ -492,8 +493,8 @@ void md_config_impl::parse_env(const char *args_var) } if (getenv("CEPH_KEYRING")) { auto locker = lock(); - string k = getenv("CEPH_KEYRING"); - values["keyring"][CONF_ENV] = Option::value_t(k); + _set_val(getenv("CEPH_KEYRING"), *find_option("keyring"), + CONF_ENV, nullptr); } if (const char *dir = getenv("CEPH_LIB")) { auto locker = lock(); @@ -540,12 +541,12 @@ template void md_config_impl::_show_config(std::ostream *out, Formatter *f) { if (out) { - *out << "name = " << name << std::endl; - *out << "cluster = " << cluster << std::endl; + *out << "name = " << values.name << std::endl; + *out << "cluster = " << values.cluster << std::endl; } if (f) { - f->dump_string("name", stringify(name)); - f->dump_string("cluster", cluster); + f->dump_string("name", stringify(values.name)); + f->dump_string("cluster", values.cluster); } for (const auto& i: schema) { const Option &opt = i.second; @@ -590,10 +591,10 @@ int md_config_impl::parse_argv(std::vector& args, int level) do_show_config_value = val; } else if (ceph_argparse_flag(args, i, "--no-mon-config", (char*)NULL)) { - no_mon_config = true; + values.no_mon_config = true; } else if (ceph_argparse_flag(args, i, "--mon-config", (char*)NULL)) { - no_mon_config = false; + values.no_mon_config = false; } else if (ceph_argparse_flag(args, i, "--foreground", "-f", (char*)NULL)) { set_val_or_die("daemonize", "false"); @@ -773,7 +774,7 @@ void md_config_impl::apply_changes(std::ostream *oss) /* * apply changes until the cluster name is assigned */ - if (cluster.size()) + if (values.cluster.size()) _apply_changes(oss); } @@ -954,17 +955,14 @@ void md_config_impl::get_defaults_bl(bufferlist *bl) for (const auto &i : schema) { ++n; encode(i.second.name, bl); - auto j = values.find(i.second.name); - if (j != values.end()) { - auto k = j->second.find(CONF_DEFAULT); - if (k != j->second.end()) { - encode(Option::to_str(k->second), bl); - continue; - } + auto [value, found] = values.get_value(i.second.name, CONF_DEFAULT); + if (found) { + encode(Option::to_str(value), bl); + } else { + string val; + conf_stringify(_get_val_default(i.second), &val); + encode(val, bl); } - string val; - conf_stringify(_get_val_default(i.second), &val); - encode(val, bl); } encode(n, defaults_bl); defaults_bl.claim_append(bl); @@ -982,22 +980,22 @@ void md_config_impl::get_config_bl( if (values_bl.length() == 0) { uint32_t n = 0; bufferlist bl; - for (auto& i : values) { - if (i.first == "fsid" || - i.first == "host") { - continue; + values.for_each([&](auto& name, auto& configs) { + if (name == "fsid" || + name == "host") { + return; } ++n; - encode(i.first, bl); - encode((uint32_t)i.second.size(), bl); - for (auto& j : i.second) { + encode(name, bl); + encode((uint32_t)configs.size(), bl); + for (auto& j : configs) { encode(j.first, bl); encode(Option::to_str(j.second), bl); } - } + }); // make sure overridden items appear, and include the default value for (auto& i : ignored_mon_values) { - if (values.count(i.first)) { + if (values.contains(i.first)) { continue; } if (i.first == "fsid" || @@ -1084,25 +1082,17 @@ Option::value_t md_config_impl::_get_val( if (!stack) { stack = &a_stack; } - - auto p = values.find(o.name); - if (p != values.end() && !p->second.empty()) { - // use highest-priority value available (see CONF_*) - return _expand_meta(p->second.rbegin()->second, &o, stack, err); - } - - return _expand_meta(_get_val_default(o), &o, stack, err); + return _expand_meta(_get_val_nometa(o), &o, stack, err); } template Option::value_t md_config_impl::_get_val_nometa(const Option& o) const { - auto p = values.find(o.name); - if (p != values.end() && !p->second.empty()) { - // use highest-priority value available (see CONF_*) - return p->second.rbegin()->second; + if (auto [value, found] = values.get_value(o.name, -1); found) { + return value; + } else { + return _get_val_default(o); } - return _get_val_default(o); } template @@ -1202,21 +1192,21 @@ Option::value_t md_config_impl::_expand_meta( //cout << " found var " << var << std::endl; // special metavariable? if (var == "type") { - out += name.get_type_name(); + out += values.name.get_type_name(); } else if (var == "cluster") { - out += cluster; + out += values.cluster; } else if (var == "name") { - out += name.to_cstr(); + out += values.name.to_cstr(); } else if (var == "host") { - if (host == "") { + if (values.host == "") { out += ceph_get_short_hostname(); } else { - out += host; + out += values.host; } } else if (var == "num") { - out += name.get_id().c_str(); + out += values.name.get_id().c_str(); } else if (var == "id") { - out += name.get_id(); + out += values.name.get_id(); } else if (var == "pid") { out += stringify(getpid()); if (o) { @@ -1333,9 +1323,9 @@ template void md_config_impl::_get_my_sections(std::vector §ions) const { assert(lock.is_locked()); - sections.push_back(name.to_str()); + sections.push_back(values.name.to_str()); - sections.push_back(name.get_type_name()); + sections.push_back(values.name.get_type_name()); sections.push_back("global"); } @@ -1420,30 +1410,20 @@ int md_config_impl::_set_val( } // Apply the value to its entry in the `values` map - auto p = values.find(opt.name); - if (p != values.end()) { - auto q = p->second.find(level); - if (q != p->second.end()) { - if (new_value == q->second) { - // no change! - return 0; - } - q->second = new_value; - } else { - p->second[level] = new_value; - } + auto result = values.set_value(opt.name, std::move(new_value), level); + switch (result) { + case ConfigValues::SET_NO_CHANGE: + return 0; + case ConfigValues::SET_NO_EFFECT: values_bl.clear(); - if (p->second.rbegin()->first > level) { - // there was a higher priority value; no effect - return 0; - } - } else { + return 0; + case ConfigValues::SET_HAVE_EFFECT: + // fallthrough + default: values_bl.clear(); - values[opt.name][level] = new_value; + _refresh(opt); + return 1; } - - _refresh(opt); - return 1; } template @@ -1454,20 +1434,11 @@ void md_config_impl::_refresh(const Option& opt) if (legacy_ptr_iter != legacy_values.end()) { update_legacy_val(opt, legacy_ptr_iter->second); } - // Was this a debug_* option update? if (opt.subsys >= 0) { string actual_val; conf_stringify(_get_val(opt), &actual_val); - int log, gather; - int r = sscanf(actual_val.c_str(), "%d/%d", &log, &gather); - if (r >= 1) { - if (r < 2) { - gather = log; - } - subsys.set_log_level(opt.subsys, log); - subsys.set_gather_level(opt.subsys, gather); - } + values.set_logging(opt.subsys, actual_val.c_str()); } else { // normal option, advertise the change. changed.insert(opt.name); @@ -1480,17 +1451,11 @@ int md_config_impl::_rm_val(const std::string& key, int level) if (schema.count(key) == 0) { return -EINVAL; } - auto i = values.find(key); - if (i == values.end()) { - return -ENOENT; - } - auto j = i->second.find(level); - if (j == i->second.end()) { - return -ENOENT; + auto ret = values.rm_val(key, level); + if (ret < 0) { + return ret; } - bool matters = (j->first == i->second.rbegin()->first); - i->second.erase(j); - if (matters) { + if (ret == ConfigValues::SET_HAVE_EFFECT) { _refresh(*find_option(key)); } values_bl.clear(); @@ -1565,7 +1530,7 @@ void md_config_impl::update_legacy_val(const Option &opt, md_config_impl::member_ptr_t member_ptr) { Option::value_t v = _get_val(opt); - boost::apply_visitor(assign_visitor(this, v), member_ptr); + boost::apply_visitor(assign_visitor(&values, v), member_ptr); } static void dump(Formatter *f, int level, Option::value_t in) @@ -1589,21 +1554,21 @@ void md_config_impl::diff( string name) const { auto locker = lock(); - for (auto& i : values) { - if (i.second.size() == 1 && - i.second.begin()->first == CONF_DEFAULT) { + values.for_each([this, f] (auto& name, auto& configs) { + if (configs.size() == 1 && + configs.begin()->first == CONF_DEFAULT) { // we only have a default value; exclude from diff - continue; + return; } - f->open_object_section(i.first.c_str()); - const Option *o = find_option(i.first); + f->open_object_section(name.c_str()); + const Option *o = find_option(name); dump(f, CONF_DEFAULT, _get_val_default(*o)); - for (auto& j : i.second) { + for (auto& j : configs) { dump(f, j.first, j.second); } dump(f, CONF_FINAL, _get_val(*o)); f->close_section(); - } + }); } template diff --git a/src/common/config.h b/src/common/config.h index 89a4677d76e0e..d6bef2b81f2fa 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -18,13 +18,13 @@ #include #include #include "common/ConfUtils.h" -#include "common/entity_name.h" #include "common/code_environment.h" #include "common/Mutex.h" #include "log/SubsystemMap.h" #include "common/options.h" #include "common/subsys_types.h" #include "common/config_fwd.h" +#include "common/config_values.h" #include "common/lock_mutex.h" class CephContext; @@ -75,14 +75,14 @@ namespace ceph::internal { template struct md_config_impl { public: - typedef boost::variant member_ptr_t; + typedef boost::variant member_ptr_t; // For use when intercepting configuration updates typedef std::function legacy_values; + std::map legacy_values; /** * The configuration schema, in the form of Option objects describing @@ -112,7 +112,7 @@ public: /** * The current values of all settings described by the schema */ - std::map> values; + ConfigValues values; /// values from mon that we failed to set std::map ignored_mon_values; @@ -304,8 +304,7 @@ private: void update_legacy_vals(); - void update_legacy_val(const Option &opt, - md_config_impl::member_ptr_t member); + void update_legacy_val(const Option &opt, member_ptr_t member); Option::value_t _expand_meta( const Option::value_t& in, @@ -343,53 +342,8 @@ private: vector