背景:
rgw在上傳對象贯吓,如何保證數(shù)據(jù)傳輸正確驶睦,依托的就是這個MD5值,而object里面的etag就是傳統(tǒng)意義上的MD5值箭券。
查看方式:
使用rados 命令
rados getxattr 54b4a9a0-ee4b-4cb7-8115-ace2272cb565.227838.2_hello.log user.rgw.etag? -p default.rgw.buckets.data
e3062b9b9799f37關(guān)鍵代碼實現(xiàn):90a847da65efeb5d
md5sum hello.log
e3062b9b9799f37a90a847da65efeb5d hello.log
關(guān)鍵代碼實現(xiàn):
//計算data的md5值茂腥,默認(rèn)是計算的狸涌,所以有MD5 sum:
if?(need_calc_md5) {
hash.Update((const?byte?*)data.c_str(), data.length());
}
hash.Final(m);
??buf_to_hex(m, CEPH_CRYPTO_MD5_DIGESTSIZE, calc_md5);
??etag = calc_md5;
使用:
1.在HEAD op獲取 obj信息時,會獲取這些值最岗。
詳見獲取obj元數(shù)據(jù)信息日志 那么獲取完這個有什么用呢帕胆。可以做個備份般渡,做個插件每次從obj獲取這個etag值懒豹,和本身文件作比較,如果值變了诊杆,就重新上傳歼捐,這樣的話減少上傳次數(shù)。
2.在PUT對象時(包括上傳分片對象)有一個Content-MD5選項晨汹,這個選項加進去后豹储,RGW 把這個值和自己計算出來的值進行比較,如果出錯就說明傳輸故障淘这,報invoiddgest錯誤剥扣,說明傳輸出錯。增加傳輸安全性铝穷。
3.分片上傳時钠怯,每次分片都會產(chǎn)生一個etag值,這個值的作用在于最后發(fā)送完成上傳操作時曙聂,同之前服務(wù)器記錄的作對比
if (part_etag.compare(obj_iter->second.etag) != 0) {
? ldout(s->cct, 0) << "NOTICE: etag mismatch: part: " << iter->first
? ? ? << " etag: " << iter->second << dendl;
? op_ret = -ERR_INVALID_PART;
? return;
}
最后REST API 類似
POST /example-object?uploadId=AAAsb2FkIElEIGZvciBlbHZpbmcncyWeeS1tb3ZpZS5tMnRzIRRwbG9hZA HTTP/1.1
Host: example-bucket.s3.amazonaws.com
Date:? Mon, 1 Nov 2010 20:34:56 GMT
Content-Length: 391
Authorization: authorization string
<CompleteMultipartUpload>
? <Part>
? ? <PartNumber>1</PartNumber>
? ? <ETag>"a54357aff0632cce46d942af68356b38"</ETag>
? </Part>
? <Part>
? ? <PartNumber>2</PartNumber>
? ? <ETag>"0c78aef83f66abc1fa1e8477f296d394"</ETag>
? </Part>
? <Part>
? ? <PartNumber>3</PartNumber>
? ? <ETag>"acbd18db4cc2f85cedef654fccc4a4d8"</ETag>
? </Part>
</CompleteMultipartUpload>