2019独角兽企业重金招聘Python工程师标准>>>
1、rgw_main.cc文件中main函数开始。
2、初始化g_ceph_context、g_conf等全局变量,以及设置参数:
global_pre_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON,
flags);
3、初始化,注册信号处理函数,创建文件夹等:
global_init(&def_args, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON,
flags, "rgw_data", false);
4、启动admin socket线程和log模块线程,方便用户调试:
common_init_finish(g_ceph_context);
5、注册RGWREST类。
a)、rest.register_resource(g_conf->rgw_swift_url_prefix,
set_logging(new RGWRESTMgr_SWIFT));
b)、rest.register_resource(g_conf->rgw_swift_auth_entry,
set_logging(new RGWRESTMgr_SWIFT_Auth));
6、申请一个RGWMongooseFrontend类,此类是RGWFrontend的子类:
fe = new RGWMongooseFrontend(env, config);
7、启动RGWMongooseFrontend类,接受客户端的请求:
r = fe->run();
8、在RGWMongooseFrontend类的run函数中,注册civetweb的回调函数:
a)、struct mg_callbacks cb;
b)、cb.begin_request = civetweb_callback;
cb.log_message = rgw_civetweb_log_callback;
cb.log_access = rgw_civetweb_log_access_callback;
9、最后启动civetweb,此函数是civeweb系统接口,如果有请求到来会调用cb中注册的civetweb_callback回调函数,env中的数据也会传到回调函数:
mg_start(&cb, &env, (const char **)&options);
10、在回调函数继续处理请求:
int ret = process_request(pe->store, rest, &req, &client_io, olog);
11、在process_request函数中,得到之前注册的不同RGWREST类:
RGWHandler_REST *handler = rest->get_handler(store, s, client_io, &mgr,
&init_error);
可以进到get_handler函数看下 ,调用RGWRESTMgr *m = mgr.get_resource_mgr(s, s->decoded_uri, &s->relative_uri); 得到不同的RGWRESTMgr类,然后调用handler = m->get_handler(s);得到handler。
12、得到不同的操作类型对象:
op = handler->get_op(store);
在get_op中申请不同的对象:
RGWOp *op;
switch (s->op) {
case OP_GET:
op = op_get();
break;
case OP_PUT:
op = op_put();
break;
case OP_DELETE:
op = op_delete();
break;
case OP_HEAD:
op = op_head();
break;
case OP_POST:
op = op_post();
break;
case OP_COPY:
op = op_copy();
break;
case OP_OPTIONS:
op = op_options();
break;
default:
return NULL;
op_get、op_put最终会调用到不同的RGWRESTMgr类中的............、RGWHandler_REST_Bucket_SWIFT类等
13、最后会执行不同类的execute函数:
op->execute();
14、最后会调用librados库中提供的接口。