博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ceph源码rgw模块分析
阅读量:7250 次
发布时间:2019-06-29

本文共 1978 字,大约阅读时间需要 6 分钟。

hot3.png

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

转载于:https://my.oschina.net/u/2326998/blog/865009

你可能感兴趣的文章
iOS开发之使用Git的基本使用(一)
查看>>
配置云存储网关在线服务支持多个互联VPC-高速通道版
查看>>
6个步骤从头开始编写机器学习算法:感知器案例研究
查看>>
NCalc 学习笔记 (三)
查看>>
NetBeans 成为 Apache 软件基金会顶级项目
查看>>
SSRF在Redis中反弹shell
查看>>
UML关系图
查看>>
SpringBoot 手写切片/面向切面编程
查看>>
动态 Web Server 技术发展历程
查看>>
使用pymysql(使用一)
查看>>
Redisson 3.10.6 发布,Redis 客户端
查看>>
日志框架 - 基于spring-boot - 使用入门
查看>>
用libtommath实现RSA算法
查看>>
基于POLARDB数据库的压测实践
查看>>
通过工具SecureCRTPortable将项目部署到服务器上
查看>>
利用QRCode实现待logo的二维码的创建
查看>>
【云周刊】第190期:阿里云超算揭秘:虚拟机的心脏,物理机的肌肉
查看>>
崩溃bug日志总结3
查看>>
推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
查看>>
shell技巧5 - 全自动打包ipa
查看>>