RGW层读取create-multipart信息:get_multipart_info()

1 概述

static int get_multipart_info()函数的主要功能是获取分段上传的ACL、placement rule以及一些元数据。

首先来看get_multipart_info函数:

cpp 复制代码
static int get_multipart_info(RGWRados *store, struct req_state *s,
			      const string& meta_oid,
                              RGWAccessControlPolicy *policy,
			      map<string, bufferlist> *attrs,
                              multipart_upload_info *upload_info)
{
  map<string, bufferlist>::iterator iter;
  bufferlist header;

  rgw_obj meta_obj;
  meta_obj.init_ns(s->bucket, meta_oid, mp_ns); // mp_ns是RGW_OBJ_NS_MULTIPART,也就是multipart
  meta_obj.set_in_extra_data(true);

  return get_multipart_info(store, s, meta_obj, policy, attrs, upload_info);
}

在执行get_multipart_info函数之前有这一步:

cpp 复制代码
RGWMPObj mp(s->object.name, multipart_upload_id);

op_ret = get_multipart_info(store, s, mp.get_meta(), nullptr, nullptr, &upload_info);

就是将文件名和upload id初始化成了一个RGWMPObj,阅读RGWMPObj的初始化函数可以得知mp.get_meta()的结果就是:oid.upload_id.meta,也就是get_multipart_info函数的meta_oid参数;接着初始化完成一个rgw_obj,接着调用同名重写函数get_multipart_info():

cpp 复制代码
static int get_multipart_info(RGWRados *store, struct req_state *s,
			      const rgw_obj& obj,
                              RGWAccessControlPolicy *policy,
			      map<string, bufferlist> *attrs,
                              multipart_upload_info *upload_info)
{
  ...

  int op_ret = get_obj_head(store, s, obj, attrs, pheadbl);
  ...

  if (upload_info && headbl.length() > 0) {
    auto hiter = headbl.cbegin();
    try {
      decode(*upload_info, hiter);
    } 
    ...
  }

  if (policy && attrs) {
    for (auto& iter : *attrs) {
      string name = iter.first;
      if (name.compare(RGW_ATTR_ACL) == 0) {
        bufferlist& bl = iter.second;
        auto bli = bl.cbegin();
        try {
          decode(*policy, bli);
        }
        ...
      }
    }
  }

  return 0;
}

首先get_obj_head调用了两个主要函数,一个是RGWRados::Object::Read::prepare(),另一个是RGWRados::Object::Read::read(),prepare()函数的主要作用:

  1. 准备要读取的对象名称,在分段上传中就是要读取位于.rgw.non-ec池中的头对象,其名称为"<bucket_id>_" + "multipart" + <key-name> + "." + <upload_id> + ".meta"

  2. 校验一些读条件的header,这些header来自http请求中的If-Match/If-None-Match等等
    这里详细的代码不过多赘述,读者可以自行探究。
    read()函数的作用则是下发一个同步请求读取对象中的内容。

    在get_multipart_info中会将读上来的multipart_upload_info和其他attrs属性的bufferlist依次解析出来,其中multipart_upload_info记录的就是目标对象写入锁遵循的placement rule。

相关推荐
知识领航员6 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
jf加菲猫8 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui
码农-阿杰8 小时前
深入理解 synchronized 底层实现:从 HotSpot C++ 源码看对象锁与 Monitor 机制
开发语言·c++·
Szime9 小时前
深智微IC华润微代理:MCU选型与工业控制方案推荐
c++
叼烟扛炮9 小时前
C++ 知识点18 内部类
开发语言·c++·算法·内部类
汉克老师10 小时前
GESP5级C++考试语法知识(十五、分治算法(二))
c++·算法·排序算法·分治算法·gesp5级·gesp五级
汉克老师10 小时前
GESP6级C++考试语法知识(五、格雷码)
c++·算法·位运算·异或·gesp6级·gesp六级·格雷码
程序leo源11 小时前
C语言知识总结
c语言·开发语言·c++·经验分享·笔记·青少年编程·c#
沫璃染墨11 小时前
二叉搜索树完全指南:从核心原理到增删查改全实现
开发语言·c++
‎ദ്ദിᵔ.˛.ᵔ₎11 小时前
C++哈希表
数据结构·c++·散列表