只是梳理了函数调用,没有详细代码注释
/*
s3_main_strategy_t(CephContext* const cct, ImplicitTenants& implicit_tenant_context, RGWCtl* const ctl)
: s3_main_strategy_plain(cct, implicit_tenant_context, ctl), s3_main_strategy_boto2(cct, implicit_tenant_context, ctl) {
add_engine(Strategy::Control::SUFFICIENT, s3_main_strategy_plain);
add_engine(Strategy::Control::FALLBACK, s3_main_strategy_boto2);
}
auth_stack = [<s3_main_strategy_plain, Strategy::Control::SUFFICIENT>, <s3_main_strategy_boto2, Strategy::Control::FALLBACK>]
*/
rgw_main()
1:初始化 auth_registry
rgw::auth::ImplicitTenants implicit_tenant_context{g_conf()};
g_conf().add_observer(&implicit_tenant_context);
auto auth_registry = \
rgw::auth::StrategyRegistry::create(g_ceph_context, implicit_tenant_context, store->getRados()->pctl);
2:beast 初始化
if (framework == "beast") {
RGWProcessEnv env{ store, &rest, olog, port, uri_prefix, auth_registry };
fe = new RGWAsioFrontend(env, config, sched_ctx);
fe->init()
fe->run() ---> AsioFrontend::run ---> 启动 cct->_conf->rgw_thread_pool_size(512)接收线程
}
接收线程开始accept,auth_registry 已经在rgw_main中通过creat初始化
AsioFrontend::accept
template <typename Stream> void handle_connection
process_request
认证
/* RGWRESTMgr_S3::get_handler
if (s->init_state.url_bucket.empty()) {
handler = new RGWHandler_REST_Service_S3(auth_registry, enable_sts, enable_iam, enable_pubsub);
} else if (s->object.empty()) {
handler = new RGWHandler_REST_Bucket_S3(auth_registry, enable_pubsub);
} else {
handler = new RGWHandler_REST_Obj_S3(auth_registry);
}
*/
RGWHandler_REST *handler = rest->get_handler(store, s, auth_registry, frontend_prefix,client_io, &mgr, &init_error);
/*
op->verify_requester ---> dialect_handler->authorize(this);
dialect_handler 在 op->init(store, s, this) 初始化即为this,this为 RGWRESTMgr_S3::get_handler 返回值
如果为getobj操作,则authentic为 ---> RGWHandler_REST_S3::authorize(RGWGetObj_ObjStore_S3*)
class RGWOp : public DoutPrefixProvider
*/
ret = op->verify_requester(auth_registry); // RGWHandler_REST_S3::authorize
RGW_Auth_S3::authorize(dpp, store, auth_registry, s)
rgw::auth::Strategy::apply(dpp, auth_registry.get_s3_main(), s); // auth_registry.get_s3_main() ---> s3_main_strategy
rgw::auth::Strategy::authenticate
engine_result = engine.authenticate(dpp, s); // AWSEngine::authenticate
AWSGeneralAbstractor::get_auth_data
AWSGeneralAbstractor::get_auth_data_v4
get_v4_signature