do {
objs.clear();
- int ret = list_op.list_objects(max_entries, &objs, &common_prefixes, &is_truncated);
+ int ret = list_op.list_objects(max_entries, &objs, &common_prefixes, &is_truncated, null_yield);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: list objects failed: " << cpp_strerror(-ret) << dendl;
return ret;
for (const auto& obj : objs) {
- const rgw_obj r_obj(bucket_info.bucket, obj.key);
- ret = get_obj_attrs(store, obj_ctx, bucket_info, r_obj, attrs);
+ rgw_obj r_obj(bucket_info.bucket, obj.key);
+ RGWRados::Object op_target(store, bucket_info, obj_ctx, r_obj);
+ RGWRados::Object::Read read_op(&op_target);
+
+ read_op.params.attrs = &attrs;
+ ret = read_op.prepare(null_yield);
if (ret < 0){
ldout(store->ctx(), 0) << "ERROR: failed to read object " << obj.key.name << cpp_strerror(-ret) << dendl;
continue;
bl.clear();
encode(policy, bl);
- ret = modify_obj_attr(store, obj_ctx, bucket_info, r_obj, RGW_ATTR_ACL, bl);
+ obj_ctx.set_atomic(r_obj);
+ ret = store->set_attr(&obj_ctx, bucket_info, r_obj, RGW_ATTR_ACL, bl);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: modify attr failed " << cpp_strerror(-ret) << dendl;
return ret;
return policies;
}
-int get_obj_attrs(RGWRados *store, RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& obj, map<string, bufferlist>& attrs)
+static int get_obj_attrs(RGWRados *store, struct req_state *s, const rgw_obj& obj, map<string, bufferlist>& attrs)
{
- RGWRados::Object op_target(store, bucket_info, obj_ctx, obj);
+ RGWRados::Object op_target(store, s->bucket_info, *static_cast<RGWObjectCtx *>(s->obj_ctx), obj);
RGWRados::Object::Read read_op(&op_target);
read_op.params.attrs = &attrs;
return get_multipart_info(store, s, meta_obj, policy, attrs, upload_info);
}
-int modify_obj_attr(RGWRados *store, RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& obj, const char* attr_name, bufferlist& attr_val)
+static int modify_obj_attr(RGWRados *store, struct req_state *s, const rgw_obj& obj, const char* attr_name, bufferlist& attr_val)
{
map<string, bufferlist> attrs;
- RGWRados::Object op_target(store, bucket_info, obj_ctx, obj);
+ RGWRados::Object op_target(store, s->bucket_info, *static_cast<RGWObjectCtx *>(s->obj_ctx), obj);
RGWRados::Object::Read read_op(&op_target);
read_op.params.attrs = &attrs;
static int rgw_iam_add_existing_objtags(RGWRados* store, struct req_state* s, rgw_obj& obj, std::uint64_t action){
map <string, bufferlist> attrs;
store->set_atomic(s->obj_ctx, obj);
- int op_ret = get_obj_attrs(store, *(s->obj_ctx), s->bucket_info, obj, attrs);
+ int op_ret = get_obj_attrs(store, s, obj, attrs);
if (op_ret < 0)
return op_ret;
auto tags = attrs.find(RGW_ATTR_TAGS);
store->set_atomic(s->obj_ctx, obj);
- op_ret = get_obj_attrs(store, *(s->obj_ctx), s->bucket_info, obj, attrs);
+ op_ret = get_obj_attrs(store, s, obj, attrs);
if (op_ret < 0) {
ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << obj
<< " ret=" << op_ret << dendl;
rgw_obj obj;
obj = rgw_obj(s->bucket, s->object);
store->set_atomic(s->obj_ctx, obj);
- op_ret = modify_obj_attr(store, *(s->obj_ctx), s->bucket_info, obj, RGW_ATTR_TAGS, tags_bl);
+ op_ret = modify_obj_attr(store, s, obj, RGW_ATTR_TAGS, tags_bl);
if (op_ret == -ECANCELED){
op_ret = -ERR_TAG_CONFLICT;
}
}
/* check if obj exists, read orig attrs */
- op_ret = get_obj_attrs(store, *(s->obj_ctx), s->bucket_info, obj, orig_attrs);
+ op_ret = get_obj_attrs(store, s, obj, orig_attrs);
if (op_ret < 0) {
return;
}
if (!s->object.empty()) {
if (need_object_expiration() || multipart_delete) {
/* check if obj exists, read orig attrs */
- op_ret = get_obj_attrs(store, *(s->obj_ctx), s->bucket_info, obj, attrs);
+ op_ret = get_obj_attrs(store, s, obj, attrs);
if (op_ret < 0) {
return;
}
obj = rgw_obj(s->bucket, s->object);
store->set_atomic(s->obj_ctx, obj);
//if instance is empty, we should modify the latest object
- op_ret = modify_obj_attr(store, *(s->obj_ctx), s->bucket_info, obj, RGW_ATTR_ACL, bl);
+ op_ret = modify_obj_attr(store, s, obj, RGW_ATTR_ACL, bl);
} else {
attrs = s->bucket_attrs;
attrs[RGW_ATTR_ACL] = bl;
return;
}
- op_ret = get_obj_attrs(store, *(s->obj_ctx), s->bucket_info, meta_obj, attrs);
+ op_ret = get_obj_attrs(store, s, meta_obj, attrs);
if (op_ret < 0) {
ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << meta_obj