From: Zhang Shaowen Date: Tue, 24 Jan 2017 07:20:32 +0000 (+0800) Subject: rgw: put object's acl can't work well on the latest object when versioning X-Git-Tag: v12.0.1~124^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fe5f95fff30cc872484de6efb6cba1dd48b09316;p=ceph-ci.git rgw: put object's acl can't work well on the latest object when versioning is enabled. Reported-by: Liu Hong Fixes: http://tracker.ceph.com/issues/18649 Signed-off-by: Zhang Shaowen --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 8f25240f4e8..751538b577e 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -277,6 +277,24 @@ static int get_obj_attrs(RGWRados *store, struct req_state *s, rgw_obj& obj, map return read_op.prepare(); } +static int modify_obj_attr(RGWRados *store, struct req_state *s, rgw_obj& obj, const char* attr_name, bufferlist& attr_val) +{ + map attrs; + RGWRados::Object op_target(store, s->bucket_info, *static_cast(s->obj_ctx), obj); + RGWRados::Object::Read read_op(&op_target); + + read_op.params.attrs = &attrs; + read_op.params.perr = &s->err; + + int r = read_op.prepare(); + if (r < 0) { + return r; + } + store->set_atomic(s->obj_ctx, read_op.state.obj); + attrs[attr_name] = attr_val; + return store->set_attrs(s->obj_ctx, read_op.state.obj, attrs, NULL); +} + static int get_system_obj_attrs(RGWRados *store, struct req_state *s, rgw_obj& obj, map& attrs, uint64_t *obj_size, RGWObjVersionTracker *objv_tracker) { @@ -4185,16 +4203,12 @@ void RGWPutACLs::execute() obj.set_instance(s->object.instance); map attrs; - store->set_atomic(s->obj_ctx, obj); - if (!s->object.empty()) { - op_ret = get_obj_attrs(store, s, obj, attrs); - if (op_ret < 0) - return; - - attrs[RGW_ATTR_ACL] = bl; - op_ret = store->set_attrs(s->obj_ctx, obj, attrs, NULL); + //if instance is empty, we should modify the latest object + op_ret = modify_obj_attr(store, s, obj, RGW_ATTR_ACL, bl); } else { + store->set_atomic(s->obj_ctx, obj); + attrs = s->bucket_attrs; attrs[RGW_ATTR_ACL] = bl; op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker);