ceph源码rgw模块分析

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

猜你喜欢

转载自my.oschina.net/u/2326998/blog/865009