ceph-rgw之etag的分析

背景:

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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。