((!nfs) || (nfs && g_conf()->rgw_nfs_run_sync_thread)));
DriverManager::Config cfg = DriverManager::get_config(false, g_ceph_context);
- driver = DriverManager::get_storage(dpp, dpp->get_cct(),
+ env.driver = DriverManager::get_storage(dpp, dpp->get_cct(),
cfg,
run_gc,
run_lc,
void rgw::AppMain::cond_init_apis()
{
- rgw_rest_init(g_ceph_context, driver->get_zone()->get_zonegroup());
+ rgw_rest_init(g_ceph_context, env.driver->get_zone()->get_zonegroup());
if (have_http_frontend) {
std::vector<std::string> apis;
if (apis_map.count("s3") > 0 || s3website_enabled) {
if (!swift_at_root) {
rest.register_default_mgr(set_logging(
- rest_filter(driver, RGW_REST_S3,
+ rest_filter(env.driver, RGW_REST_S3,
new RGWRESTMgr_S3(s3website_enabled, sts_enabled,
iam_enabled, pubsub_enabled))));
} else {
if (! swift_at_root) {
rest.register_resource(g_conf()->rgw_swift_url_prefix,
- set_logging(rest_filter(driver, RGW_REST_SWIFT,
+ set_logging(rest_filter(env.driver, RGW_REST_SWIFT,
swift_resource)));
} else {
- if (driver->get_zone()->get_zonegroup().get_zone_count() > 1) {
+ if (env.driver->get_zone()->get_zonegroup().get_zone_count() > 1) {
derr << "Placing Swift API in the root of URL hierarchy while running"
<< " multi-site configuration requires another instance of RadosGW"
<< " with S3 API enabled!" << dendl;
admin_resource->register_resource("info", new RGWRESTMgr_Info);
admin_resource->register_resource("usage", new RGWRESTMgr_Usage);
/* Register driver-specific admin APIs */
- driver->register_admin_apis(admin_resource);
+ env.driver->register_admin_apis(admin_resource);
rest.register_resource(g_conf()->rgw_admin_entry, admin_resource);
}
} /* have_http_frontend */
void rgw::AppMain::init_ldap()
{
- const string &ldap_uri = driver->ctx()->_conf->rgw_ldap_uri;
- const string &ldap_binddn = driver->ctx()->_conf->rgw_ldap_binddn;
- const string &ldap_searchdn = driver->ctx()->_conf->rgw_ldap_searchdn;
- const string &ldap_searchfilter = driver->ctx()->_conf->rgw_ldap_searchfilter;
- const string &ldap_dnattr = driver->ctx()->_conf->rgw_ldap_dnattr;
- std::string ldap_bindpw = parse_rgw_ldap_bindpw(driver->ctx());
+ CephContext* cct = env.driver->ctx();
+ const string &ldap_uri = cct->_conf->rgw_ldap_uri;
+ const string &ldap_binddn = cct->_conf->rgw_ldap_binddn;
+ const string &ldap_searchdn = cct->_conf->rgw_ldap_searchdn;
+ const string &ldap_searchfilter = cct->_conf->rgw_ldap_searchfilter;
+ const string &ldap_dnattr = cct->_conf->rgw_ldap_dnattr;
+ std::string ldap_bindpw = parse_rgw_ldap_bindpw(cct);
ldh.reset(new rgw::LDAPHelper(ldap_uri, ldap_binddn,
ldap_bindpw.c_str(), ldap_searchdn, ldap_searchfilter, ldap_dnattr));
void rgw::AppMain::init_opslog()
{
- rgw_log_usage_init(dpp->get_cct(), driver);
+ rgw_log_usage_init(dpp->get_cct(), env.driver);
OpsLogManifold *olog_manifold = new OpsLogManifold();
if (!g_conf()->rgw_ops_log_socket_path.empty()) {
ops_log_file->start();
olog_manifold->add_sink(ops_log_file);
}
- olog_manifold->add_sink(new OpsLogRados(driver));
+ olog_manifold->add_sink(new OpsLogRados(env.driver));
olog = olog_manifold;
} /* init_opslog */
implicit_tenant_context.reset(new rgw::auth::ImplicitTenants{g_conf()});
g_conf().add_observer(implicit_tenant_context.get());
auto auth_registry =
- rgw::auth::StrategyRegistry::create(dpp->get_cct(), *(implicit_tenant_context.get()), driver);
+ rgw::auth::StrategyRegistry::create(dpp->get_cct(), *implicit_tenant_context, env.driver);
/* allocate a mime table (you'd never guess that from the name) */
rgw_tools_init(dpp, dpp->get_cct());
ratelimiter.reset(new ActiveRateLimiter{dpp->get_cct()});
ratelimiter->start();
+ // initialize RGWProcessEnv
+ env.rest = &rest;
+ env.olog = olog;
+ env.auth_registry = auth_registry;
+ env.ratelimiting = ratelimiter.get();
+ env.lua_background = lua_background.get();
+
int fe_count = 0;
for (multimap<string, RGWFrontendConfig *>::iterator fiter = fe_map.begin();
fiter != fe_map.end(); ++fiter, ++fe_count) {
RGWFrontend* fe = nullptr;
if (framework == "loadgen") {
- RGWProcessEnv env = {driver, &rest, olog,
- auth_registry, ratelimiter.get(), lua_background.get()};
-
fe = new RGWLoadGenFrontend(env, config);
}
else if (framework == "beast") {
- int port;
- config->get_val("port", 80, &port);
- RGWProcessEnv env{driver, &rest, olog,
- auth_registry, ratelimiter.get(), lua_background.get()};
- fe = new RGWAsioFrontend(env, config, *(sched_ctx.get()));
+ fe = new RGWAsioFrontend(env, config, *sched_ctx);
}
else if (framework == "rgw-nfs") {
- RGWProcessEnv env = { driver, &rest, olog };
fe = new RGWLibFrontend(env, config);
if (rgwlib) {
rgwlib->set_fe(static_cast<RGWLibFrontend*>(fe));
}
std::string daemon_type = (nfs) ? "rgw-nfs" : "rgw";
- r = driver->register_to_service_map(dpp, daemon_type, service_map_meta);
+ r = env.driver->register_to_service_map(dpp, daemon_type, service_map_meta);
if (r < 0) {
derr << "ERROR: failed to register to service map: " << cpp_strerror(-r) << dendl;
/* ignore error */
}
- if (driver->get_name() == "rados") {
+ if (env.driver->get_name() == "rados") {
// add a watcher to respond to realm configuration changes
- pusher = std::make_unique<RGWPeriodPusher>(dpp, driver, null_yield);
+ pusher = std::make_unique<RGWPeriodPusher>(dpp, env.driver, null_yield);
fe_pauser = std::make_unique<RGWFrontendPauser>(fes, *(implicit_tenant_context.get()), pusher.get());
rgw_pauser = std::make_unique<RGWPauser>();
rgw_pauser->add_pauser(fe_pauser.get());
if (lua_background) {
rgw_pauser->add_pauser(lua_background.get());
}
- reloader = std::make_unique<RGWRealmReloader>(driver, service_map_meta, rgw_pauser.get());
+ reloader = std::make_unique<RGWRealmReloader>(env, service_map_meta, rgw_pauser.get());
realm_watcher = std::make_unique<RGWRealmWatcher>(dpp, g_ceph_context,
- static_cast<rgw::sal::RadosStore*>(driver)->svc()->zone->get_realm());
+ static_cast<rgw::sal::RadosStore*>(env.driver)->svc()->zone->get_realm());
realm_watcher->add_watcher(RGWRealmNotify::Reload, *reloader);
realm_watcher->add_watcher(RGWRealmNotify::ZonesNeedPeriod, *pusher.get());
}
void rgw::AppMain::init_lua()
{
+ rgw::sal::Driver* driver = env.driver;
int r{0};
const auto &luarocks_path =
g_conf().get_val<std::string>("rgw_luarocks_location");
void rgw::AppMain::shutdown(std::function<void(void)> finalize_async_signals)
{
- if (driver->get_name() == "rados") {
+ if (env.driver->get_name() == "rados") {
reloader.reset(); // stop the realm reloader
}
lua_background->shutdown();
}
- DriverManager::close_storage(driver);
+ DriverManager::close_storage(env.driver);
rgw_tools_cleanup();
rgw_shutdown_resolver();
#include "rgw_log.h"
#include "rgw_rest.h"
#include "rgw_user.h"
+#include "rgw_process.h"
#include "rgw_sal.h"
#include "rgw_sal_rados.h"
static constexpr bool USE_SAFE_TIMER_CALLBACKS = false;
-RGWRealmReloader::RGWRealmReloader(rgw::sal::Driver*& driver, std::map<std::string, std::string>& service_map_meta,
+RGWRealmReloader::RGWRealmReloader(RGWProcessEnv& env, std::map<std::string, std::string>& service_map_meta,
Pauser* frontends)
- : driver(driver),
+ : env(env),
service_map_meta(service_map_meta),
frontends(frontends),
- timer(driver->ctx(), mutex, USE_SAFE_TIMER_CALLBACKS),
+ timer(env.driver->ctx(), mutex, USE_SAFE_TIMER_CALLBACKS),
mutex(ceph::make_mutex("RGWRealmReloader")),
reload_scheduled(nullptr)
{
void RGWRealmReloader::handle_notify(RGWRealmNotify type,
bufferlist::const_iterator& p)
{
- if (!driver) {
+ if (!env.driver) {
/* we're in the middle of reload */
return;
}
- CephContext *const cct = driver->ctx();
+ CephContext *const cct = env.driver->ctx();
std::lock_guard lock{mutex};
if (reload_scheduled) {
void RGWRealmReloader::reload()
{
- CephContext *const cct = driver->ctx();
+ CephContext *const cct = env.driver->ctx();
const DoutPrefix dp(cct, dout_subsys, "rgw realm reloader: ");
ldpp_dout(&dp, 1) << "Pausing frontends for realm update..." << dendl;
rgw_log_usage_finalize();
// destroy the existing driver
- DriverManager::close_storage(driver);
- driver = nullptr;
+ DriverManager::close_storage(env.driver);
+ env.driver = nullptr;
ldpp_dout(&dp, 1) << "driver closed" << dendl;
{
}
- while (!driver) {
+ while (!env.driver) {
// recreate and initialize a new driver
DriverManager::Config cfg;
cfg.store_name = "rados";
cfg.filter_name = "none";
- driver =
+ env.driver =
DriverManager::get_storage(&dp, cct,
cfg,
cct->_conf->rgw_enable_gc_threads,
// don't want to assert or abort the entire cluster. instead, just
// sleep until we get another notification, and retry until we get
// a working configuration
- if (driver == nullptr) {
+ if (env.driver == nullptr) {
ldpp_dout(&dp, -1) << "Failed to reinitialize RGWRados after a realm "
"configuration update. Waiting for a new update." << dendl;
// if we successfully created a driver, clean it up outside of the lock,
// then continue to loop and recreate another
- std::swap(driver, store_cleanup);
+ std::swap(env.driver, store_cleanup);
}
}
}
}
- int r = driver->register_to_service_map(&dp, "rgw", service_map_meta);
+ int r = env.driver->register_to_service_map(&dp, "rgw", service_map_meta);
if (r < 0) {
ldpp_dout(&dp, -1) << "ERROR: failed to register to service map: " << cpp_strerror(-r) << dendl;
ldpp_dout(&dp, 1) << "Finishing initialization of new driver" << dendl;
// finish initializing the new driver
ldpp_dout(&dp, 1) << " - REST subsystem init" << dendl;
- rgw_rest_init(cct, driver->get_zone()->get_zonegroup());
+ rgw_rest_init(cct, env.driver->get_zone()->get_zonegroup());
ldpp_dout(&dp, 1) << " - usage subsystem init" << dendl;
- rgw_log_usage_init(cct, driver);
+ rgw_log_usage_init(cct, env.driver);
ldpp_dout(&dp, 1) << "Resuming frontends with new realm configuration." << dendl;
- frontends->resume(driver);
+ frontends->resume(env.driver);
}