通過計算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...