背景:
rgw在上传对象,如何保证数据传输正确,依托的就是这个MD5值,而object里面的etag就是传统意义上的MD5值。
查看方式:
使用rados 命令
rados getxattr 54b4a9a0-ee4b-4cb7-8115-ace2272cb565.227838.2_hello.log user.rgw.etag -p default.rgw.buckets.data
e3062b9b9799f37关键代码实现:90a847da65efeb5d
md5sum hello.log
e3062b9b9799f37a90a847da65efeb5d hello.log
关键代码实现:
//计算data的md5值,默认是计算的,所以有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元数据信息日志 那么获取完这个有什么用呢。可以做个备份,做个插件每次从obj获取这个etag值,和本身文件作比较,如果值变了,就重新上传,这样的话减少上传次数。
2.在PUT对象时(包括上传分片对象)有一个Content-MD5选项,这个选项加进去后,RGW 把这个值和自己计算出来的值进行比较,如果出错就说明传输故障,报invoiddgest错误,说明传输出错。增加传输安全性。
3.分片上传时,每次分片都会产生一个etag值,这个值的作用在于最后发送完成上传操作时,同之前服务器记录的作对比
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>