From: Yehuda Sadeh Date: Fri, 30 Jun 2017 16:04:05 +0000 (-0400) Subject: rgw: register as a service X-Git-Tag: v12.1.1~98^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F15858%2Fhead;p=ceph.git rgw: register as a service support dynamic reload, and also add frontend info Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_frontend.h b/src/rgw/rgw_frontend.h index 1c999b4d68fe..dc4563c76d91 100644 --- a/src/rgw/rgw_frontend.h +++ b/src/rgw/rgw_frontend.h @@ -50,6 +50,10 @@ public: return out; } + const std::string& get_config() { + return config; + } + std::map& get_config_map() { return config_map; } diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index f4e57be713a9..85ec5fec0c0e 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -26,6 +26,7 @@ #include "common/safe_io.h" #include "include/compat.h" #include "include/str_list.h" +#include "include/stringify.h" #include "rgw_common.h" #include "rgw_rados.h" #include "rgw_user.h" @@ -470,15 +471,21 @@ int main(int argc, const char **argv) register_async_signal_handler(SIGUSR1, handle_sigterm); sighandler_alrm = signal(SIGALRM, godown_alarm); + map service_map_meta; + service_map_meta["pid"] = stringify(getpid()); + list fes; + int fe_count = 0; + for (multimap::iterator fiter = fe_map.begin(); - fiter != fe_map.end(); ++fiter) { + fiter != fe_map.end(); ++fiter, ++fe_count) { RGWFrontendConfig *config = fiter->second; string framework = config->get_framework(); RGWFrontend *fe = NULL; if (framework == "civetweb" || framework == "mongoose") { + framework = "civetweb"; std::string uri_prefix; config->get_val("prefix", "", &uri_prefix); @@ -509,6 +516,7 @@ int main(int argc, const char **argv) #endif /* WITH_RADOSGW_BEAST_FRONTEND */ #if defined(WITH_RADOSGW_FCGI_FRONTEND) else if (framework == "fastcgi" || framework == "fcgi") { + framework = "fastcgi"; std::string uri_prefix; config->get_val("prefix", "", &uri_prefix); RGWProcessEnv fcgi_pe = { store, &rest, olog, 0, uri_prefix, auth_registry }; @@ -517,6 +525,9 @@ int main(int argc, const char **argv) } #endif /* WITH_RADOSGW_FCGI_FRONTEND */ + service_map_meta["frontend_type#" + stringify(fe_count)] = framework; + service_map_meta["frontend_config#" + stringify(fe_count)] = config->get_config(); + if (fe == NULL) { dout(0) << "WARNING: skipping unknown framework: " << framework << dendl; continue; @@ -537,10 +548,18 @@ int main(int argc, const char **argv) fes.push_back(fe); } + r = store->register_to_service_map("rgw", service_map_meta); + if (r < 0) { + derr << "ERROR: failed to register to service map: " << cpp_strerror(-r) << dendl; + + /* ignore error */ + } + + // add a watcher to respond to realm configuration changes RGWPeriodPusher pusher(store); RGWFrontendPauser pauser(fes, &pusher); - RGWRealmReloader reloader(store, &pauser); + RGWRealmReloader reloader(store, service_map_meta, &pauser); preloader = &reloader; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9dafa0b420c2..53cee1148bb9 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3752,7 +3752,6 @@ int RGWRados::init_rados() if (ret < 0) { return ret; } - ret = r.connect(); if (ret < 0) { return ret; @@ -3778,6 +3777,28 @@ int RGWRados::init_rados() return ret; } + +int RGWRados::register_to_service_map(const string& daemon_type, const map& meta) +{ + map metadata = meta; + metadata["num_handles"] = stringify(rados.size()); + metadata["zonegroup_id"] = zonegroup.get_id(); + metadata["zonegroup_name"] = zonegroup.get_name(); + metadata["zone_name"] = zone_name(); + metadata["zone_id"] = zone_id();; + string name = cct->_conf->name.get_id(); + if (name.find("rgw.") == 0) { + name = name.substr(4); + } + int ret = rados[0].service_daemon_register(daemon_type, name, metadata); + if (ret < 0) { + ldout(cct, 0) << "ERROR: service_daemon_register() returned ret=" << ret << ": " << cpp_strerror(-ret) << dendl; + return ret; + } + + return 0; +} + /** * Add new connection to connections map * @param zonegroup_conn_map map which new connection will be added to @@ -5893,7 +5914,7 @@ int RGWRados::select_bucket_location_by_rule(const string& location_rule, RGWZon map::iterator piter = get_zone_params().placement_pools.find(location_rule); if (piter == get_zone_params().placement_pools.end()) { /* couldn't find, means we cannot really place data for this bucket in this zone */ - if (get_zonegroup().equals(zonegroup_id)) { + if (get_zonegroup().equals(zonegroup.get_id())) { /* that's a configuration error, zone should have that rule, as we're within the requested * zonegroup */ return -EINVAL; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 4759320f39c7..a36226c088f8 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2332,8 +2332,6 @@ protected: bool pools_initialized; - string zonegroup_id; - string zone_name; string trans_id_suffix; RGWQuotaHandler *quota_handler; @@ -2565,6 +2563,8 @@ public: int initialize(); void finalize(); + int register_to_service_map(const string& daemon_type, const map& meta); + void schedule_context(Context *c); /** set up a bucket listing. handle is filled in. */ @@ -3537,6 +3537,9 @@ public: int add_bucket_to_reshard(const RGWBucketInfo& bucket_info, uint32_t new_num_shards); uint64_t instance_id(); + const string& zone_name() { + return get_zone_params().get_name(); + } const string& zone_id() { return get_zone_params().get_id(); } diff --git a/src/rgw/rgw_realm_reloader.cc b/src/rgw/rgw_realm_reloader.cc index 8df554a5f3b3..2bae84c1ecbd 100644 --- a/src/rgw/rgw_realm_reloader.cc +++ b/src/rgw/rgw_realm_reloader.cc @@ -9,6 +9,8 @@ #include "rgw_rest.h" #include "rgw_user.h" +#include "common/errno.h" + #define dout_subsys ceph_subsys_rgw #undef dout_prefix @@ -21,8 +23,10 @@ static constexpr bool USE_SAFE_TIMER_CALLBACKS = false; -RGWRealmReloader::RGWRealmReloader(RGWRados*& store, Pauser* frontends) +RGWRealmReloader::RGWRealmReloader(RGWRados*& store, std::map& service_map_meta, + Pauser* frontends) : store(store), + service_map_meta(service_map_meta), frontends(frontends), timer(store->ctx(), mutex, USE_SAFE_TIMER_CALLBACKS), mutex("RGWRealmReloader"), @@ -144,6 +148,13 @@ void RGWRealmReloader::reload() } } + int r = store->register_to_service_map("rgw", service_map_meta); + if (r < 0) { + lderr(cct) << "ERROR: failed to register to service map: " << cpp_strerror(-r) << dendl; + + /* ignore error */ + } + ldout(cct, 1) << "Finishing initialization of new store" << dendl; // finish initializing the new store ldout(cct, 1) << " - REST subsystem init" << dendl; diff --git a/src/rgw/rgw_realm_reloader.h b/src/rgw/rgw_realm_reloader.h index e4e3a4363425..ab9f4e56ec4b 100644 --- a/src/rgw/rgw_realm_reloader.h +++ b/src/rgw/rgw_realm_reloader.h @@ -32,7 +32,8 @@ class RGWRealmReloader : public RGWRealmWatcher::Watcher { virtual void resume(RGWRados* store) = 0; }; - RGWRealmReloader(RGWRados*& store, Pauser* frontends); + RGWRealmReloader(RGWRados*& store, std::map& service_map_meta, + Pauser* frontends); ~RGWRealmReloader() override; /// respond to realm notifications by scheduling a reload() @@ -46,6 +47,7 @@ class RGWRealmReloader : public RGWRealmWatcher::Watcher { /// main()'s RGWRados pointer as a reference, modified by reload() RGWRados*& store; + std::map& service_map_meta; Pauser *const frontends; /// reload() takes a significant amount of time, so we don't want to run