process_request O版本rgw处理请求入口

1:基于S3协议的put操作说明
2:rgw处理client的请求的入口
3:下次分析put obj 的execute流程

int process_request(rgw::sal::RGWRadosStore* const store, RGWREST* const rest, RGWRequest* const req, 
					const std::string& frontend_prefix, const rgw_auth_registry_t& auth_registry, 
					RGWRestfulIO* const client_io, OpsLogSocket* const olog, optional_yield yield,
                    rgw::dmclock::Scheduler *scheduler, int* http_ret) {
  // ClientIO::init_env 一些信息保存到 ClientIO::env的env_map中
  int ret = client_io->init(g_ceph_context);
  perfcounter->inc(l_rgw_req);
  RGWEnv& rgw_env = client_io->get_env();

  rgw::sal::RGWRadosUser user;
  // clientIo的env初始化到req_state中,同时 req_info::req_info
  struct req_state rstate(g_ceph_context, &rgw_env, &user, req->id);  
  struct req_state *s = &rstate;
  
  // s初始化
  RGWObjectCtx rados_ctx(store, s);
  s->obj_ctx = &rados_ctx;
  auto sysobj_ctx = store->svc()->sysobj->init_obj_ctx();
  s->sysobj_ctx = &sysobj_ctx;
  ........

  // RGWREST::get_handler   ----- 01
  RGWHandler_REST *handler = rest->get_handler(store, s, auth_registry, frontend_prefix, client_io, &mgr, &init_error);

  rgw::dmclock::SchedulerCompleter c;
  should_log = mgr->get_logging();

  // 以写对象为例,RGWHandler_REST::get_op ---> RGWHandler_REST_Obj_S3::op_put ---> RGWPutObj_ObjStore_S3 ,
  // 然后初始化:op->init(store, s, this); *this 为 RGWRESTMgr_S3
  op = handler->get_op();

  // 调度
  std::tie(ret,c) = schedule_request(scheduler, s, op);

  req->op = op;
  s->op_type = op->get_type();

  try { 
    // 认证(对比auth) RGWHandler_REST_S3::authorize ---> RGW_Auth_S3::authorize(认证后续单独梳理)
    ret = op->verify_requester(auth_registry);
    // RGWHandler_REST_S3::postauth_init 验证参数,如果存在MFA则校验MFA
    ret = handler->postauth_init();
    // ---- 02
    ret = rgw_process_authenticated(handler, op, req, s);
  }

  return (ret < 0 ? ret : s->err.ret);
} /* process_request */


----------------------------------------------------------------------------------------------- 01
RGWHandler_REST* RGWREST::get_handler(rgw::sal::RGWRadosStore * const store, struct req_state* const s, const rgw::auth::StrategyRegistry& auth_registry,
        const std::string& frontend_prefix, RGWRestfulIO* const rio, RGWRESTMgr** const pmgr, int* const init_error) {
  // struct req_state rstate(g_ceph_context, &rgw_env, &user, req->id);这个时候会将clientIo中的信息进行解析,
  // 同时初始req_info,用于参数检查
  *init_error = preprocess(s, rio);
  
  // rgw_main.cc中初始化rest,工厂模式。此时为s3协议,*m = RGWRESTMgr_S3
  RGWRESTMgr *m = mgr.get_manager(s, frontend_prefix, s->decoded_uri, &s->relative_uri);
  if (pmgr) *pmgr = m;

  // RGWRESTMgr_S3::get_handler 假设为s3 put_obj 返回 RGWHandler_REST_Obj_S3 。
  // RGWHandler_REST_S3::init_from_header 参数解析
  RGWHandler_REST* handler = m->get_handler(s, auth_registry, frontend_prefix);

  // RGWHandler_REST_S3::init 解析:acl、grent、存储类型。如果存在copy_source且不是(range&&分片上传),则检查copy需要的参数
  *init_error = handler->init(store, s, rio);

  return handler;
}

----------------------------------------------------------------------------------------------- 02
// RGWHandler_REST_Obj_S3  RGWPutObj_ObjStore_S3
int rgw_process_authenticated(RGWHandler_REST* const handler, RGWOp*& op,
                              RGWRequest* const req, req_state* const s, const bool skip_retarget) {
  // 获取bucket信息,用户acl/iam,桶acl(policy?)初始化  ------ 03
  int ret = handler->init_permissions(op);

  // 某些情况下需要检查对象的acl
  ret = handler->read_permissions(op);

  //  quota检查
  ret = op->init_processing();

  // RGWOp::verify_op_mask  对象读写删除权限检查
  ret = op->verify_op_mask();

  // OPA
  if (s->cct->_conf->rgw_use_opa_authz) ret = rgw_opa_authorize(op, s);

  // RGWPutObj::verify_permission ---> RGWPutObj_ObjStore_S3::get_params  ---- 04
  ret = op->verify_permission();

  ret = op->verify_params();
  op->pre_exec();

  // RGWPutObj::execute ---- 05
  op->execute();

  // 返回rsp
  op->complete();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 环境下,您可以通过以下步骤来安装 Ceph 对象网关 (Rados Gateway, RGW): 1. 安装 Ceph 首先,您需要在 Linux 系统上安装 Ceph。Ceph 是一个分布式存储系统,RGW 是 Ceph 的一部分。您可以从 Ceph 的官方网站下载最新版本的 Ceph 软件包,并按照其文档进行安装。或者,如果您使用的是 Ubuntu 或 Debian 等基于 Debian 的 Linux 发行版,可以通过以下命令安装 Ceph: ``` sudo apt-get update sudo apt-get install ceph ``` 2. 创建 RGW 用户 在安装 RGW 之前,您需要创建一个 Ceph 用户,用于管理 RGW。您可以使用以下命令创建一个名为 rgw-admin 的 Ceph 用户: ``` sudo radosgw-admin user create --uid=rgw-admin --display-name="RGW Administrator" ``` 这将会创建一个具有管理员特权的 RGW 用户。请注意,您需要记住创建用户时生成的访问密钥,后面安装 RGW 时需要使用。 3. 安装 RGW 安装 RGW 之前,您需要确认 Ceph 集群已经正确地配置和运行。然后,您可以使用以下命令安装 RGW: ``` sudo apt-get install radosgw ``` 安装完成后,您需要修改 RGW 配置文件 `/etc/ceph/ceph.conf`,以指定 RGW 的配置参数。以下是一个示例配置文件: ``` [client.rgw.gateway] rgw frontends = "civetweb port=80" # RGW 使用 civetweb 作为 Web 服务器,并监听 80 端口 rgw dns name = <RGW 主机名> # RGW 主机名 rgw keystone url = http://<keystone 主机名>:5000 # OpenStack Keystone 的 URL,用于身份验证 rgw keystone admin user = <管理员用户名> # OpenStack Keystone 管理员用户名 rgw keystone admin password = <管理员密码> # OpenStack Keystone 管理员密码 rgw keystone admin tenant = <管理员租户> # OpenStack Keystone 管理员所在租户名称 rgw keystone api version = 3 # OpenStack Keystone API 版本 rgw s3 auth use keystone = true # 使用 OpenStack Keystone 进行身份验证 rgw enable usage log = true # 启用 RGW 的使用日志 rgw usage log tick interval = 15 # 使用日志的时间间隔 [client.rgw.gateway.civetweb] port = 80 # civetweb 监听的端口 ``` 在修改完成 RGW 配置文件后,您需要启动 RGW 服务,以便它可以监听来自客户端的请求: ``` sudo systemctl start radosgw ``` 此外,您还可以通过以下命令检查 RGW 服务是否正在运行: ``` sudo systemctl status radosgw ``` 如果 RGW 服务已经成功启动,您应该能够看到类似于以下的输出: ``` ● radosgw.service - LSB: radosgw RESTful rados gateway Loaded: loaded (/etc/init.d/radosgw; generated) Active: active (running) since Thu 2021-10-07 15:24:07 CST; 5s ago Docs: man:systemd-sysv-generator(8) Process: 18589 ExecStart=/etc/init.d/radosgw start (code=exited, status=0/SUCCESS) Tasks: 35 (limit: 4915) CGroup: /system.slice/radosgw.service ├─18598 /usr/bin/radosgw --foreground --conf /etc/ceph/ceph.conf --rgw-frontends=civetweb port=80 ├─18599 /usr/bin/radosgw --foreground --conf /etc/ceph/ceph.conf --rgw-frontends=civetweb port=80 └─18600 /usr/bin/radosgw --foreground --conf /etc/ceph/ceph.conf --rgw-frontends=civetweb port=80 ``` 4. 配置 RGW 安装和启动 RGW 后,您需要为 RGW 配置用户访问权限。您可以使用以下命令创建一个名为 test-bucket 的 S3 存储桶: ``` sudo s3cmd mb s3://test-bucket ``` 此外,您还可以使用以下命令在 test-bucket 存储桶中上传一个名为 test-object 的对象: ``` sudo s3cmd put <本地文件路径> s3://test-bucket/test-object ``` 然后,您可以使用以下命令从 test-bucket 存储桶中下载 test-object 对象: ``` sudo s3cmd get s3://test-bucket/test-object <本地文件路径> ``` 这些命令应该可以帮助您在 Linux 环境下安装和配置 Ceph 对象网关 (RGW)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值