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库中提供的接口。