ceph關於multipart讀取資料的總結

2021-07-24 10:53:25 字數 2028 閱讀 4298

通過計算rgwobjmanifest的obj_iterator中的各種偏移量來獲取下乙個multipart的location相關資訊,目的是通過location的object欄位來從ceph中按照長度讀取需要的obj

下面是乙個location的結構

location = else else {-----------------------------------------------當cur_stripe=0時,mannifest的location中object的組合以.cur_part_id_cur_stripe結尾

snprintf(buf, sizeof(buf), ".%d_%d", (int)cur_part_id, (int)cur_stripe);

oid += buf;

ns = shadow_ns;

正好反映了上述rados -p default.rgw.buckets.data ls的查詢結果。

讀取**功能在如下函式中,下面進行詳細分析:

int rgwrados::iterate_obj(rgwobjectctx& obj_ctx, rgw_obj& obj,

off_t ofs, off_t end,

uint64_t max_chunk_size,

int (*iterate_obj_cb)(rgw_obj&, off_t, off_t, off_t, bool, rgwobjstate *, void *),

void *arg)

if (astate->has_manifest) {

/* now get the relevant object stripe */

rgwobjmanifest::obj_iterator iter = astate->manifest.obj_find(ofs);

rgwobjmanifest::obj_iterator obj_end = astate->manifest.obj_end();

for (; iter != obj_end && ofs <= end; ++iter) {

off_t stripe_ofs = iter.get_stripe_ofs();   ---------------------------當前的切片偏移量,初值為0

off_t next_stripe_ofs = stripe_ofs + iter.get_stripe_size(); -----下乙個切片的偏移量,為退出while迴圈使用

while (ofs < next_stripe_ofs&& ofs <= end) {

read_obj = iter.get_location();--------------------- 返回location,其中包括的待讀取的object名字。

uint64_t read_len = min(len, iter.get_stripe_size() - (ofs - stripe_ofs));------------- 計算出了要讀取的長度。

read_ofs = iter.location_ofs() + (ofs - stripe_ofs);------------- 計算出了要讀取的起始偏移量。

if (read_len > max_chunk_size) {

read_len = max_chunk_size;

reading_from_head = (read_obj == obj);

r = iterate_obj_cb(read_obj, ofs, read_ofs, read_len, reading_from_head, astate, arg);   ---- 開始讀取資料。

if (r < 0) {

return r;

len -= read_len;

ofs += read_len;  ---- 累加讀取的長度

關於Multipart上傳文章的簡單描述

使用multipartfile上傳檔案的時候 幾點注意事項 第一種使用submit form表單上傳方式 1.在form表單中需要加 enctype multipart form data 2.上傳檔案的名稱也要標記 如 name file 3.form表單的提交方式必須使用post方式提交,如果使...

HttpClient之Multipart上傳檔案

multipart的具體含義可參考博文,或者rfc2046,httpclient提供的multipartentitybuilder類是對此規範的具體實現。如下圖所示,最重要的屬性有三個 每個part的具體實現類,同樣包含三個重要屬性 contentbody表示part中具體的資料,如下圖所示有四個實...

Multipart上傳filename亂碼

使用httpclient上傳檔案,檔名是中文,需要設定http為相容模式,否則會使用mime預設的編碼 us ascii 中文檔名就亂碼了,原始碼分析如下。瀏覽器相容模式 設定的charset utf 8 檔名正常 編碼過程如下 private static void writebytes fina...