}
// Update object attrs
- set_atomic();
+ set_atomic(true);
attrs[attr_name] = attr_val;
ret = set_dir_entry_attrs(dpp, &ent, &attrs);
if (r < 0) {
return r;
}
- set_atomic();
+ set_atomic(true);
state.attrset[attr_name] = attr_val;
return set_obj_attrs(dpp, &state.attrset, nullptr, y, rgw::sal::FLAG_LOG_OP);
}
Attrs rmattr;
bufferlist bl;
- set_atomic();
+ set_atomic(true);
rmattr[attr_name] = bl;
return set_obj_attrs(dpp, nullptr, &rmattr, y, rgw::sal::FLAG_LOG_OP);
}
{
ldpp_dout(dpp, 0) << __func__ << "(): deleting obj=" << obj << dendl;
- obj->set_atomic();
+ obj->set_atomic(true);
RGWObjState *state;
rgw_obj dest_obj(dest_bucket, rgw_obj_key(target_obj_name));
- tier_ctx.obj->set_atomic();
+ tier_ctx.obj->set_atomic(true);
/* Prepare Read from source */
/* TODO: Define readf, writef as stack variables. For some reason,
rgw_obj dest_obj(dest_bucket, rgw_obj_key(target_obj_name));
- tier_ctx.obj->set_atomic();
+ tier_ctx.obj->set_atomic(true);
/* TODO: Define readf, writef as stack variables. For some reason,
* when used as stack variables (esp., readf), the transition seems to
}
std::unique_ptr<rgw::sal::Object> obj = bucket->get_object(key);
- obj->set_atomic();
+ obj->set_atomic(true);
ret = obj->delete_object(dpp, null_yield, rgw::sal::FLAG_LOG_OP, nullptr, nullptr);
return ret;
return r;
}
- obj_ctx.set_atomic(head_obj);
+ obj_ctx.set_atomic(head_obj, true);
RGWRados::Object op_target(store, bucket_info, obj_ctx, head_obj);
if (r < 0) {
return r;
}
- obj_ctx.set_atomic(head_obj);
+ obj_ctx.set_atomic(head_obj, true);
RGWRados::Object op_target(store, bucket_info, obj_ctx, head_obj);
//For Append obj, disable versioning
op_target.set_versioning_disabled(true);
objs_state[obj].state.compressed = true;
}
-void RGWObjectCtx::set_atomic(const rgw_obj& obj) {
+void RGWObjectCtx::set_atomic(const rgw_obj& obj, bool atomic) {
std::unique_lock wl{lock};
assert (!obj.empty());
- objs_state[obj].state.is_atomic = true;
+ objs_state[obj].state.is_atomic = atomic;
}
void RGWObjectCtx::set_prefetch_data(const rgw_obj& obj) {
std::unique_lock wl{lock};
return 0;
}
- obj_ctx.set_atomic(obj);
+ obj_ctx.set_atomic(obj, true);
RGWObjState * state = nullptr;
RGWObjManifest *manifest = nullptr;
gen_rand_obj_instance_name(&dest_obj);
}
- obj_ctx.set_atomic(dest_obj);
+ obj_ctx.set_atomic(dest_obj, true);
rgw_zone_id no_zone;
gen_rand_obj_instance_name(&obj);
}
- obj_ctx.set_atomic(archive_obj);
- obj_ctx.set_atomic(obj);
+ obj_ctx.set_atomic(archive_obj, true);
+ obj_ctx.set_atomic(obj, true);
jspan_context no_trace{false, false};
real_time read_mtime;
uint64_t obj_size;
- obj_ctx.set_atomic(obj);
+ obj_ctx.set_atomic(obj, true);
RGWRados::Object op_target(this, bucket_info, obj_ctx, obj);
RGWRados::Object::Read read_op(&op_target);
const RGWObjState& state)
{
// only overwrite if the tag hasn't changed
- obj_ctx.set_atomic(state.obj);
+ obj_ctx.set_atomic(state.obj, true);
// make a tiny adjustment to the existing mtime so that fetch_remote_obj()
// won't return ERR_NOT_MODIFIED when resyncing the object
return r;
}
+ // if prefetch was requested, apply it to the target too
+ if (olh_state->prefetch_data) {
+ obj_ctx.set_prefetch_data(target);
+ }
+
return get_obj_state(dpp, &obj_ctx, bucket_info, target, psm, false, y);
}
RGWObjStateManifest *get_state(const rgw_obj& obj);
void set_compressed(const rgw_obj& obj);
- void set_atomic(const rgw_obj& obj);
+ void set_atomic(const rgw_obj& obj, bool atomic);
void set_prefetch_data(const rgw_obj& obj);
void invalidate(const rgw_obj& obj);
};
int append_async(const DoutPrefixProvider *dpp, rgw_raw_obj& obj, size_t size, bufferlist& bl);
public:
- void set_atomic(void *ctx, const rgw_obj& obj) {
+ void set_atomic(void *ctx, const rgw_obj& obj, bool atomic) {
RGWObjectCtx *rctx = static_cast<RGWObjectCtx *>(ctx);
- rctx->set_atomic(obj);
+ rctx->set_atomic(obj, atomic);
}
void set_prefetch_data(void *ctx, const rgw_obj& obj) {
RGWObjectCtx *rctx = static_cast<RGWObjectCtx *>(ctx);
/* Temporarily set target */
state.obj = target;
- set_atomic();
+ set_atomic(true);
state.attrset[attr_name] = attr_val;
r = set_obj_attrs(dpp, &state.attrset, nullptr, y, rgw::sal::FLAG_LOG_OP);
/* Restore target */
Attrs rmattr;
bufferlist bl;
- set_atomic();
+ set_atomic(true);
rmattr[attr_name] = bl;
return set_obj_attrs(dpp, nullptr, &rmattr, y, rgw::sal::FLAG_LOG_OP);
}
bl.clear();
encode(policy, bl);
- set_atomic();
+ set_atomic(true);
map<string, bufferlist> attrs;
attrs[RGW_ATTR_ACL] = bl;
r = set_obj_attrs(dpp, &attrs, nullptr, y, rgw::sal::FLAG_LOG_OP);
RGWRados::Object op_target(store->getRados(), bucket->get_info(), *rados_ctx, get_obj());
RGWRados::Object::Write obj_op(&op_target);
- set_atomic();
+ set_atomic(true);
obj_op.meta.modify_tail = true;
obj_op.meta.flags = PUT_OBJ_CREATE;
obj_op.meta.category = RGWObjCategory::CloudTiered;
attrs[RGW_ATTR_COMPRESSION] = tmp;
}
- target_obj->set_atomic();
+ target_obj->set_atomic(true);
const RGWBucketInfo& bucket_info = target_obj->get_bucket()->get_info();
RGWRados::Object op_target(store->getRados(), bucket_info,
const DoutPrefixProvider* dpp, optional_yield y) override;
virtual RGWAccessControlPolicy& get_acl(void) override { return acls; }
virtual int set_acl(const RGWAccessControlPolicy& acl) override { acls = acl; return 0; }
- virtual void set_atomic() override {
- rados_ctx->set_atomic(state.obj);
- StoreObject::set_atomic();
+ virtual void set_atomic(bool atomic) override {
+ rados_ctx->set_atomic(state.obj, atomic);
+ StoreObject::set_atomic(atomic);
}
virtual void set_prefetch_data() override {
rados_ctx->set_prefetch_data(state.obj);
return -ERR_NO_SUCH_BUCKET;
}
- s->object->set_atomic();
+ s->object->set_atomic(true);
if (prefetch_data) {
s->object->set_prefetch_data();
}
}
static int rgw_iam_remove_objtags(const DoutPrefixProvider *dpp, req_state* s, rgw::sal::Object* object, bool has_existing_obj_tag, bool has_resource_tag) {
- object->set_atomic();
+ object->set_atomic(true);
int op_ret = object->get_obj_attrs(s->yield, dpp);
if (op_ret < 0)
return op_ret;
}
static int rgw_iam_add_objtags(const DoutPrefixProvider *dpp, req_state* s, rgw::sal::Object* object, bool has_existing_obj_tag, bool has_resource_tag) {
- object->set_atomic();
+ object->set_atomic(true);
int op_ret = object->get_obj_attrs(s->yield, dpp);
if (op_ret < 0)
return op_ret;
auto attr_iter = attrs.find(RGW_ATTR_OBJ_REPLICATION_STATUS);
if (attr_iter != attrs.end() && attr_iter->second.to_str() == "PENDING") {
if (s->object->is_sync_completed(dpp, obj_mtime)) {
- s->object->set_atomic();
+ s->object->set_atomic(true);
rgw::sal::Attrs setattrs, rmattrs;
bufferlist bl;
bl.append("COMPLETED");
setattrs[RGW_ATTR_OBJ_REPLICATION_STATUS] = bl;
int ret = s->object->set_obj_attrs(dpp, &setattrs, &rmattrs, s->yield, 0);
+ s->object->set_atomic(false);
if (ret == 0) {
ldpp_dout(dpp, 20) << *s->object << " has amz-replication-status header set to COMPLETED" << dendl;
}
int RGWGetObj::verify_permission(optional_yield y)
{
- s->object->set_atomic();
+ s->object->set_atomic(true);
if (prefetch_data()) {
s->object->set_prefetch_data();
{
rgw::sal::Attrs attrs;
- s->object->set_atomic();
+ s->object->set_atomic(true);
op_ret = s->object->get_obj_attrs(y, this);
return;
}
- s->object->set_atomic();
+ s->object->set_atomic(true);
op_ret = s->object->modify_obj_attrs(RGW_ATTR_TAGS, tags_bl, y, this);
if (op_ret == -ECANCELED){
op_ret = -ERR_TAG_CONFLICT;
ldpp_dout(this, 20) << "reading obj=" << part << " ofs=" << cur_ofs
<< " end=" << cur_end << dendl;
- part->set_atomic();
+ part->set_atomic(true);
part->set_prefetch_data();
std::unique_ptr<rgw::sal::Object::ReadOp> read_op = part->get_read_op();
auto cs_bucket = driver->get_bucket(copy_source_bucket_info);
auto cs_object = cs_bucket->get_object(rgw_obj_key(copy_source_object_name,
copy_source_version_id));
- cs_object->set_atomic();
+ cs_object->set_atomic(true);
cs_object->set_prefetch_data();
/* check source object permissions */
{
rgw::sal::Attrs attrs, rmattrs;
- s->object->set_atomic();
+ s->object->set_atomic(true);
op_ret = get_params(y);
if (op_ret < 0) {
return;
}
- s->object->set_atomic();
+ s->object->set_atomic(true);
bool ver_restored = false;
op_ret = s->object->swift_versioning_restore(s->owner, s->user->get_id(),
/* get buckets info (source and dest) */
if (s->local_source && source_zone.empty()) {
- s->src_object->set_atomic();
+ s->src_object->set_atomic(true);
s->src_object->set_prefetch_data();
rgw_placement_rule src_placement;
RGWAccessControlPolicy dest_bucket_policy;
- s->object->set_atomic();
+ s->object->set_atomic(true);
/* check dest bucket permissions */
op_ret = read_bucket_policy(this, driver, s, s->bucket->get_info(),
s->object->gen_rand_obj_instance_name();
}
- s->src_object->set_atomic();
- s->object->set_atomic();
+ s->src_object->set_atomic(true);
+ s->object->set_atomic(true);
encode_delete_at_attr(delete_at, attrs);
map<string, bufferlist> attrs;
if (!rgw::sal::Object::empty(s->object.get())) {
- s->object->set_atomic();
+ s->object->set_atomic(true);
//if instance is empty, we should modify the latest object
op_ret = s->object->modify_obj_attrs(RGW_ATTR_ACL, bl, s->yield, this);
} else {
return;
}
- obj->set_atomic();
+ obj->set_atomic(true);
std::string version_id; // empty
std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op();
bucket_owner.id = bucket->get_info().owner;
std::unique_ptr<rgw::sal::Object> obj = bucket->get_object(path.obj_key);
- obj->set_atomic();
+ obj->set_atomic(true);
std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op();
del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status();
int RGWGetAttrs::verify_permission(optional_yield y)
{
- s->object->set_atomic();
+ s->object->set_atomic(true);
auto [has_s3_existing_tag, has_s3_resource_tag] = rgw_check_policy_condition(this, s);
if (has_s3_existing_tag || has_s3_resource_tag)
if (op_ret < 0)
return;
- s->object->set_atomic();
+ s->object->set_atomic(true);
op_ret = s->object->get_obj_attrs(s->yield, this);
if (op_ret < 0) {
if (op_ret < 0)
return;
- s->object->set_atomic();
+ s->object->set_atomic(true);
op_ret = s->object->set_obj_attrs(this, nullptr, &attrs, y, rgw::sal::FLAG_LOG_OP);
if (op_ret < 0) {
std::unique_ptr<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(subdir_name));
- obj->set_atomic();
+ obj->set_atomic(true);
RGWObjState* state = nullptr;
if (obj->get_obj_state(s, &state, s->yield) < 0) {
std::unique_ptr<rgw::sal::Object> slo_seg = bucket->get_object(rgw_obj_key(obj_name));
/* no prefetch */
- slo_seg->set_atomic();
+ slo_seg->set_atomic(true);
bool compressed;
RGWCompressionInfo cs_info;
std::unique_ptr<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(std::move(subdir_name)));
/* First, get attrset of the object we'll try to retrieve. */
- obj->set_atomic();
+ obj->set_atomic(true);
obj->set_prefetch_data();
RGWObjState* state = nullptr;
{
std::unique_ptr<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(index));
- obj->set_atomic();
+ obj->set_atomic(true);
obj->set_prefetch_data();
RGWObjState* state = nullptr;
/** Set the ACL for this object */
virtual int set_acl(const RGWAccessControlPolicy& acl) = 0;
/** Mark further operations on this object as being atomic */
- virtual void set_atomic() = 0;
+ virtual void set_atomic(bool atomic) = 0;
/** Check if this object is atomic */
virtual bool is_atomic() = 0;
/** Pre-fetch data when reading */
if (r < 0) {
return r;
}
- set_atomic();
+ set_atomic(true);
state.attrset[attr_name] = attr_val;
return set_obj_attrs(dpp, &state.attrset, nullptr, y, 0);
}
Attrs rmattr;
bufferlist bl;
- set_atomic();
+ set_atomic(true);
rmattr[attr_name] = bl;
return set_obj_attrs(dpp, nullptr, &rmattr, y, 0);
}
const DoutPrefixProvider* dpp, optional_yield y) override;
virtual RGWAccessControlPolicy& get_acl(void) override;
virtual int set_acl(const RGWAccessControlPolicy& acl) override { return next->set_acl(acl); }
- virtual void set_atomic() override { return next->set_atomic(); }
+ virtual void set_atomic(bool atomic) override { return next->set_atomic(atomic); }
virtual bool is_atomic() override { return next->is_atomic(); }
virtual void set_prefetch_data() override { return next->set_prefetch_data(); }
virtual bool is_prefetch_data() override { return next->is_prefetch_data(); }
virtual ~StoreObject() = default;
- virtual void set_atomic() override { state.is_atomic = true; }
+ virtual void set_atomic(bool atomic) override { state.is_atomic = atomic; }
virtual bool is_atomic() override { return state.is_atomic; }
virtual void set_prefetch_data() override { state.prefetch_data = true; }
virtual bool is_prefetch_data() override { return state.prefetch_data; }