RGW 添加 AppendObject API,可以以追加写的方式上传对象.
特性出至:rgw: Add append object api. #22755 (https://github.com/ceph/ceph/pull/22755)
- 用 AppendObject 操作上传的对象叫 appendable object,用 PutObject 操作上传的对象叫 normal object
- 对已存在的 normal object 进行 AppendObject 操作会返回错误;对已存在的 appendable object 进行 PutObject 操作会覆写该对象,且对象的类型变为 normal object
- appendable object 通过 multisite 被同步到对端集群后,对应目标对象的类型会变为 normal object,但是源对象还是 appendable object,仍可以进行 AppendObject 操作;
- 当存储桶的版本控制功能开启或暂停时,不能对存储桶内对象使用 AppendObject 操作
s3 appedn API:
PUT /{bucket}/{object}?append&position= HTTP/1.1
append 参数: 用于指定这是一个AppendObject操作。
position 参数:用于指定从何处进行追加。首次追加操作的position必须为0,后续追加操作的position是Object的当前长度。
例如,第一次AppendObject请求指定position值为0,content-length是65536,则第二次AppendObject需要指定position为65536。
每次操作成功后,响应消息头x-rgw-next-append-position也会返回下一次追加的位置。
错误信息:
{ ERR_POSITION_NOT_EQUAL_TO_LENGTH, {409, "PositionNotEqualToLength"}},
{ ERR_OBJECT_NOT_APPENDABLE, {409, "ObjectNotAppendable"}},
{ ERR_INVALID_BUCKET_STATE, {409, "InvalidBucketState"}},
- s3 apped debug: 使用append 接口后会触发GC机制,导致过一段时候后,创建的对象会被删除。(The append operation will trigger the garbage collection mechanism) https://tracker.ceph.com/issues/42670
RGW append实现的不足:
- 目前ceph append api 只支持对添加了append标签的对象进行追加操作。但是不支持对原有对象automic object 和multpart 对象进行append 操作。
依据目前ceph 社区提供的append api 接口可以进行内部的扩展,是可以做到兼并原来对象的append操作。
append 的操作限制:
- 多版本开启后,不支持追加操作。
- 开启压缩加密后,追加操作并未进行实际的加密压缩,而是跳过加密和压缩执行过程,进行追加操作。