From: Daniel Gryniewicz Date: Tue, 28 Sep 2021 16:12:15 +0000 (-0400) Subject: RGW - Zipper - remove RGWObjectCtx from SAL API X-Git-Tag: v18.0.0~1218^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=88bcacc23abd3525926183eaf2668d7d3a04eef7;p=ceph.git RGW - Zipper - remove RGWObjectCtx from SAL API RGWObjectCtx is a RADOS-specific concept, but it's threaded through the whole of RGW. Remove it from the SAL API, and from everything above the line, leaving it only in RadosStore. As part of this, move RGWObjState to SAL and use it as the key for an Object. Signed-off-by: Daniel Gryniewicz --- diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index 18c4140e60b3..4ec71216398b 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -241,10 +241,8 @@ namespace rgw { // XXX fix this s->cio = io; - RGWObjectCtx rados_ctx(store, s); // XXX holds std::map - /* XXX and -then- stash req_state pointers everywhere they are needed */ - ret = req->init(rgw_env, &rados_ctx, io, s); + ret = req->init(rgw_env, store, io, s); if (ret < 0) { ldpp_dout(op, 10) << "failed to initialize request" << dendl; abort_req(s, op, ret); @@ -377,11 +375,10 @@ namespace rgw { struct req_state* s = req->get_state(); RGWLibIO& io_ctx = req->get_io(); RGWEnv& rgw_env = io_ctx.get_env(); - RGWObjectCtx& rados_ctx = req->get_octx(); rgw_env.set("HTTP_HOST", ""); - int ret = req->init(rgw_env, &rados_ctx, &io_ctx, s); + int ret = req->init(rgw_env, store, &io_ctx, s); if (ret < 0) { ldpp_dout(op, 10) << "failed to initialize request" << dendl; abort_req(s, op, ret); diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 3ea1119e0ff8..d4984f254406 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -1573,8 +1573,7 @@ int set_user_quota(OPT opt_cmd, RGWUser& user, RGWUserAdminOpState& op_state, in int check_min_obj_stripe_size(rgw::sal::Store* store, rgw::sal::Object* obj, uint64_t min_stripe_size, bool *need_rewrite) { - RGWObjectCtx obj_ctx(store); - int ret = obj->get_obj_attrs(&obj_ctx, null_yield, dpp()); + int ret = obj->get_obj_attrs(null_yield, dpp()); if (ret < 0) { ldpp_dout(dpp(), -1) << "ERROR: failed to stat object, returned error: " << cpp_strerror(-ret) << dendl; return ret; @@ -1630,8 +1629,7 @@ int check_obj_locator_underscore(rgw::sal::Object* obj, bool fix, bool remove_ba f->dump_string("oid", oid); f->dump_string("locator", locator); - RGWObjectCtx obj_ctx(store); - std::unique_ptr read_op = obj->get_read_op(&obj_ctx); + std::unique_ptr read_op = obj->get_read_op(); int ret = read_op->prepare(null_yield, dpp()); bool needs_fixing = (ret == -ENOENT); @@ -7122,12 +7120,11 @@ next: map > log; bool is_truncated; - RGWObjectCtx rctx(store); std::unique_ptr obj = bucket->get_object(object); RGWObjState *state; - ret = obj->get_obj_state(dpp(), &rctx, &state, null_yield); + ret = obj->get_obj_state(dpp(), &state, null_yield); if (ret < 0) { return -ret; } @@ -7746,9 +7743,7 @@ next: std::unique_ptr obj = bucket->get_object(object); obj->set_instance(object_version); - RGWObjectCtx obj_ctx(store); - - ret = obj->get_obj_attrs(&obj_ctx, null_yield, dpp()); + ret = obj->get_obj_attrs(null_yield, dpp()); if (ret < 0) { cerr << "ERROR: failed to stat object, returned error: " << cpp_strerror(-ret) << std::endl; return 1; diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 12772f1ea28b..2bccf186e186 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -315,15 +315,13 @@ bool rgw_bucket_object_check_filter(const std::string& oid) int rgw_remove_object(const DoutPrefixProvider *dpp, rgw::sal::Store* store, rgw::sal::Bucket* bucket, rgw_obj_key& key) { - RGWObjectCtx rctx(store); - if (key.instance.empty()) { key.instance = "null"; } std::unique_ptr object = bucket->get_object(key); - return object->delete_object(dpp, &rctx, null_yield); + return object->delete_object(dpp, null_yield); } static void set_err_msg(std::string *sink, std::string msg) @@ -723,8 +721,7 @@ int rgw_object_get_attr(const DoutPrefixProvider *dpp, rgw::sal::Store* store, rgw::sal::Object* obj, const char* attr_name, bufferlist& out_bl, optional_yield y) { - RGWObjectCtx obj_ctx(store); - std::unique_ptr rop = obj->get_read_op(&obj_ctx); + std::unique_ptr rop = obj->get_read_op(); return rop->get_attr(dpp, attr_name, out_bl, y); } @@ -2922,7 +2919,7 @@ int RGWBucketCtl::chown(rgw::sal::Store* store, rgw::sal::Bucket* bucket, for (const auto& obj : results.objs) { std::unique_ptr r_obj = bucket->get_object(obj.key); - ret = r_obj->get_obj_attrs(&obj_ctx, y, dpp); + ret = r_obj->get_obj_attrs(y, dpp); if (ret < 0){ ldpp_dout(dpp, 0) << "ERROR: failed to read object " << obj.key.name << cpp_strerror(-ret) << dendl; continue; @@ -2963,10 +2960,10 @@ int RGWBucketCtl::chown(rgw::sal::Store* store, rgw::sal::Bucket* bucket, bl.clear(); encode(policy, bl); - r_obj->set_atomic(&obj_ctx); + r_obj->set_atomic(); map attrs; attrs[RGW_ATTR_ACL] = bl; - ret = r_obj->set_obj_attrs(dpp, &obj_ctx, &attrs, nullptr, y); + ret = r_obj->set_obj_attrs(dpp, &attrs, nullptr, y); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: modify attr failed " << cpp_strerror(-ret) << dendl; return ret; diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 67a11f430bc0..57e9aa575b78 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1672,7 +1672,6 @@ struct req_state : DoutPrefixProvider { Clock::duration time_elapsed() const { return Clock::now() - time; } - RGWObjectCtx *obj_ctx{nullptr}; std::string dialect; std::string req_id; std::string trans_id; @@ -1811,6 +1810,10 @@ struct rgw_obj { rgw_obj(const rgw_bucket& b, const rgw_obj_key& k) : bucket(b), key(k) {} rgw_obj(const rgw_bucket& b, const rgw_obj_index_key& k) : bucket(b), key(k) {} + void init(const rgw_bucket& b, const rgw_obj_key& k) { + bucket = b; + key = k; + } void init(const rgw_bucket& b, const std::string& name) { bucket = b; key.set(name); diff --git a/src/rgw/rgw_cr_rados.cc b/src/rgw/rgw_cr_rados.cc index 7af1f5a7fec2..55a8791c038a 100644 --- a/src/rgw/rgw_cr_rados.cc +++ b/src/rgw/rgw_cr_rados.cc @@ -740,17 +740,13 @@ int RGWAsyncStatRemoteObj::_send_request(const DoutPrefixProvider *dpp) int RGWAsyncRemoveObj::_send_request(const DoutPrefixProvider *dpp) { - RGWObjectCtx obj_ctx(store); - - rgw_obj obj(bucket_info.bucket, key); - ldpp_dout(dpp, 0) << __func__ << "(): deleting obj=" << obj << dendl; - obj_ctx.set_atomic(obj); + obj->set_atomic(); RGWObjState *state; - int ret = store->getRados()->get_obj_state(dpp, &obj_ctx, bucket_info, obj, &state, null_yield); + int ret = obj->get_obj_state(dpp, &state, null_yield); if (ret < 0) { ldpp_dout(dpp, 20) << __func__ << "(): get_obj_state() obj=" << obj << " returned ret=" << ret << dendl; return ret; @@ -776,26 +772,25 @@ int RGWAsyncRemoveObj::_send_request(const DoutPrefixProvider *dpp) } } - RGWRados::Object del_target(store->getRados(), bucket_info, obj_ctx, obj); - RGWRados::Object::Delete del_op(&del_target); + std::unique_ptr del_op = obj->get_delete_op(); - del_op.params.bucket_owner = bucket_info.owner; - del_op.params.obj_owner = policy.get_owner(); + del_op->params.bucket_owner = bucket->get_info().owner; + del_op->params.obj_owner = policy.get_owner(); if (del_if_older) { - del_op.params.unmod_since = timestamp; + del_op->params.unmod_since = timestamp; } if (versioned) { - del_op.params.versioning_status = BUCKET_VERSIONED; + del_op->params.versioning_status = BUCKET_VERSIONED; } - del_op.params.olh_epoch = versioned_epoch; - del_op.params.marker_version_id = marker_version_id; - del_op.params.obj_owner.set_id(rgw_user(owner)); - del_op.params.obj_owner.set_name(owner_display_name); - del_op.params.mtime = timestamp; - del_op.params.high_precision_time = true; - del_op.params.zones_trace = &zones_trace; + del_op->params.olh_epoch = versioned_epoch; + del_op->params.marker_version_id = marker_version_id; + del_op->params.obj_owner.set_id(rgw_user(owner)); + del_op->params.obj_owner.set_name(owner_display_name); + del_op->params.mtime = timestamp; + del_op->params.high_precision_time = true; + del_op->params.zones_trace = &zones_trace; - ret = del_op.delete_obj(null_yield, dpp); + ret = del_op->delete_obj(dpp, null_yield); if (ret < 0) { ldpp_dout(dpp, 20) << __func__ << "(): delete_obj() obj=" << obj << " returned ret=" << ret << dendl; } diff --git a/src/rgw/rgw_cr_rados.h b/src/rgw/rgw_cr_rados.h index 23ee4a6a9d08..5d1b1edca72b 100644 --- a/src/rgw/rgw_cr_rados.h +++ b/src/rgw/rgw_cr_rados.h @@ -1168,9 +1168,9 @@ class RGWAsyncRemoveObj : public RGWAsyncRadosRequest { rgw::sal::RadosStore* store; rgw_zone_id source_zone; - RGWBucketInfo bucket_info; + std::unique_ptr bucket; + std::unique_ptr obj; - rgw_obj_key key; std::string owner; std::string owner_display_name; bool versioned; @@ -1198,8 +1198,6 @@ public: real_time& _timestamp, rgw_zone_set* _zones_trace) : RGWAsyncRadosRequest(caller, cn), dpp(_dpp), store(_store), source_zone(_source_zone), - bucket_info(_bucket_info), - key(_key), owner(_owner), owner_display_name(_owner_display_name), versioned(_versioned), @@ -1207,12 +1205,14 @@ public: del_if_older(_if_older), timestamp(_timestamp) { if (_delete_marker) { - marker_version_id = key.instance; + marker_version_id = _key.instance; } if (_zones_trace) { zones_trace = *_zones_trace; } + store->get_bucket(nullptr, _bucket_info, &bucket); + obj = bucket->get_object(_key); } }; diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 6fa4e817155c..d705c402005f 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1866,7 +1866,7 @@ namespace rgw { } } processor = get_store()->get_atomic_writer(this, state->yield, state->object->clone(), - state->bucket_owner.get_id(), *state->obj_ctx, + state->bucket_owner.get_id(), &state->dest_placement, 0, state->req_id); op_ret = processor->prepare(state->yield); diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index be3adc75754e..d1c19ab0a500 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -1376,11 +1376,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -1514,11 +1511,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -1818,11 +1812,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -1900,11 +1891,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -1960,11 +1948,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2014,11 +1999,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED int rc = valid_s3_object_name(obj_name); @@ -2113,11 +2095,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2197,11 +2176,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2275,11 +2251,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2352,11 +2325,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2418,11 +2388,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2543,11 +2510,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2634,11 +2598,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; @@ -2719,11 +2680,8 @@ public: virtual int op_init() { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2773,11 +2731,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2830,11 +2785,8 @@ public: virtual int op_init() { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } @@ -2878,11 +2830,8 @@ public: int op_init() override { // assign store, s, and dialect_handler - RGWObjectCtx* rados_ctx - = static_cast(get_state()->obj_ctx); // framework promises to call op_init after parent init - ceph_assert(rados_ctx); - RGWOp::init(rados_ctx->get_store(), get_state(), this); + RGWOp::init(RGWHandler::store, get_state(), this); op = this; // assign self as op: REQUIRED return 0; } diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 4570689eea8e..81df1d9fb02a 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -374,12 +374,12 @@ static bool obj_has_expired(const DoutPrefixProvider *dpp, CephContext *cct, cep return (timediff >= cmp); } -static bool pass_object_lock_check(rgw::sal::Store* store, rgw::sal::Object* obj, RGWObjectCtx& ctx, const DoutPrefixProvider *dpp) +static bool pass_object_lock_check(rgw::sal::Store* store, rgw::sal::Object* obj, const DoutPrefixProvider *dpp) { if (!obj->get_bucket()->get_info().obj_lock_enabled()) { return true; } - std::unique_ptr read_op = obj->get_read_op(&ctx); + std::unique_ptr read_op = obj->get_read_op(); int ret = read_op->prepare(null_yield, dpp); if (ret < 0) { if (ret == -ENOENT) { @@ -609,7 +609,7 @@ static int remove_expired_obj( obj = bucket->get_object(obj_key); std::unique_ptr del_op - = obj->get_delete_op(&oc.rctx); + = obj->get_delete_op(); del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status(); del_op->params.obj_owner.set_id(rgw_user {meta.owner}); @@ -619,7 +619,7 @@ static int remove_expired_obj( del_op->params.marker_version_id = version_id; std::unique_ptr notify - = store->get_notification(dpp, obj.get(), nullptr, &oc.rctx, event_type, + = store->get_notification(dpp, obj.get(), nullptr, event_type, bucket.get(), lc_id, const_cast(oc.bucket->get_tenant()), lc_req_id, null_yield); @@ -900,8 +900,7 @@ int RGWLC::handle_multipart_expiration(rgw::sal::Bucket* target, if (obj_has_expired(this, cct, obj.meta.mtime, rule.mp_expiration)) { rgw_obj_key key(obj.key); std::unique_ptr mpu = target->get_multipart_upload(key.name); - RGWObjectCtx rctx(store); - int ret = mpu->abort(this, cct, &rctx); + int ret = mpu->abort(this, cct); if (ret == 0) { if (perfcounter) { perfcounter->inc(l_rgw_lc_abort_mpu, 1); @@ -967,9 +966,9 @@ int RGWLC::handle_multipart_expiration(rgw::sal::Bucket* target, return 0; } -static int read_obj_tags(const DoutPrefixProvider *dpp, rgw::sal::Object* obj, RGWObjectCtx& ctx, bufferlist& tags_bl) +static int read_obj_tags(const DoutPrefixProvider *dpp, rgw::sal::Object* obj, bufferlist& tags_bl) { - std::unique_ptr rop = obj->get_read_op(&ctx); + std::unique_ptr rop = obj->get_read_op(); return rop->get_attr(dpp, RGW_ATTR_TAGS, tags_bl, null_yield); } @@ -1015,7 +1014,7 @@ static int check_tags(const DoutPrefixProvider *dpp, lc_op_ctx& oc, bool *skip) *skip = true; bufferlist tags_bl; - int ret = read_obj_tags(dpp, oc.obj.get(), oc.rctx, tags_bl); + int ret = read_obj_tags(dpp, oc.obj.get(), tags_bl); if (ret < 0) { if (ret != -ENODATA) { ldpp_dout(oc.dpp, 5) << "ERROR: read_obj_tags returned r=" @@ -1184,7 +1183,7 @@ public: << oc.wq->thr_name() << dendl; return is_expired && - pass_object_lock_check(oc.store, oc.obj.get(), oc.rctx, dpp); + pass_object_lock_check(oc.store, oc.obj.get(), dpp); } int process(lc_op_ctx& oc) { @@ -1349,7 +1348,7 @@ public: real_time read_mtime; - std::unique_ptr read_op(oc.obj->get_read_op(&oc.rctx)); + std::unique_ptr read_op(oc.obj->get_read_op()); read_op->params.lastmod = &read_mtime; @@ -1365,8 +1364,9 @@ public: attrs = oc.obj->get_attrs(); + /* TODO dang - need to replace this with something zipper */ rgw::sal::RadosStore *rados = static_cast(oc.store); - RGWRados::Object op_target(rados->getRados(), oc.bucket->get_info(), oc.rctx, oc.obj->get_obj()); + RGWRados::Object op_target(rados->getRados(), oc.bucket, oc.rctx, oc.obj.get()); RGWRados::Object::Write obj_op(&op_target); obj_op.meta.modify_tail = true; @@ -1447,7 +1447,7 @@ public: S3RESTConn conn(oc.cct, oc.store, id, { endpoint }, key, region, host_style); RGWLCCloudTierCtx tier_ctx(oc.cct, oc.dpp, oc.o, oc.store, oc.bucket->get_info(), - oc.obj.get(), oc.rctx, conn, bucket_name, + oc.obj.get(), conn, bucket_name, oc.tier.t.s3.target_storage_class); tier_ctx.acl_mappings = oc.tier.t.s3.acl_mappings; tier_ctx.multipart_min_part_size = oc.tier.t.s3.multipart_min_part_size; @@ -1514,7 +1514,7 @@ public: if (!r && oc.tier.tier_type == "cloud-s3") { ldpp_dout(oc.dpp, 30) << "Found cloud s3 tier: " << target_placement.storage_class << dendl; if (!oc.o.is_current() && - !pass_object_lock_check(oc.store, oc.obj.get(), oc.rctx, oc.dpp)) { + !pass_object_lock_check(oc.store, oc.obj.get(), oc.dpp)) { /* Skip objects which has object lock enabled. */ ldpp_dout(oc.dpp, 10) << "Object(key:" << oc.o.key << ") is locked. Skipping transition to cloud-s3 tier: " << target_placement.storage_class << dendl; return 0; @@ -1545,7 +1545,7 @@ public: return -EINVAL; } - int r = oc.obj->transition(oc.rctx, oc.bucket, target_placement, o.meta.mtime, + int r = oc.obj->transition(oc.bucket, target_placement, o.meta.mtime, o.versioned_epoch, oc.dpp, null_yield); if (r < 0) { ldpp_dout(oc.dpp, 0) << "ERROR: failed to transition obj " diff --git a/src/rgw/rgw_lc_tier.cc b/src/rgw/rgw_lc_tier.cc index 704b7dee2e27..82cd913e9933 100644 --- a/src/rgw/rgw_lc_tier.cc +++ b/src/rgw/rgw_lc_tier.cc @@ -340,10 +340,9 @@ class RGWLCStreamRead public: RGWLCStreamRead(CephContext *_cct, const DoutPrefixProvider *_dpp, - RGWObjectCtx& obj_ctx, rgw::sal::Object *_obj, - const real_time &_mtime) : + rgw::sal::Object *_obj, const real_time &_mtime) : cct(_cct), dpp(_dpp), obj(_obj), mtime(_mtime), - read_op(obj->get_read_op(&obj_ctx)) {} + read_op(obj->get_read_op()) {} ~RGWLCStreamRead() {}; int set_range(off_t _ofs, off_t _end); @@ -785,7 +784,7 @@ static int cloud_tier_plain_transfer(RGWLCCloudTierCtx& tier_ctx) { return -1; } - tier_ctx.obj->set_atomic(&tier_ctx.rctx); + tier_ctx.obj->set_atomic(); /* Prepare Read from source */ /* TODO: Define readf, writef as stack variables. For some reason, @@ -794,7 +793,7 @@ static int cloud_tier_plain_transfer(RGWLCCloudTierCtx& tier_ctx) { */ std::shared_ptr readf; readf.reset(new RGWLCStreamRead(tier_ctx.cct, tier_ctx.dpp, - tier_ctx.rctx, tier_ctx.obj, tier_ctx.o.meta.mtime)); + tier_ctx.obj, tier_ctx.o.meta.mtime)); std::shared_ptr writef; writef.reset(new RGWLCCloudStreamPut(tier_ctx.dpp, obj_properties, tier_ctx.conn, @@ -840,14 +839,14 @@ static int cloud_tier_send_multipart_part(RGWLCCloudTierCtx& tier_ctx, return -1; } - tier_ctx.obj->set_atomic(&tier_ctx.rctx); + tier_ctx.obj->set_atomic(); /* TODO: Define readf, writef as stack variables. For some reason, * when used as stack variables (esp., readf), the transition seems to * be taking lot of time eventually erroring out at times. */ std::shared_ptr readf; readf.reset(new RGWLCStreamRead(tier_ctx.cct, tier_ctx.dpp, - tier_ctx.rctx, tier_ctx.obj, tier_ctx.o.meta.mtime)); + tier_ctx.obj, tier_ctx.o.meta.mtime)); std::shared_ptr writef; writef.reset(new RGWLCCloudStreamPut(tier_ctx.dpp, obj_properties, tier_ctx.conn, @@ -1125,7 +1124,7 @@ static int cloud_tier_multipart_transfer(RGWLCCloudTierCtx& tier_ctx) { } if (ret == -ENOENT) { - RGWLCStreamRead readf(tier_ctx.cct, tier_ctx.dpp, tier_ctx.rctx, tier_ctx.obj, tier_ctx.o.meta.mtime); + RGWLCStreamRead readf(tier_ctx.cct, tier_ctx.dpp, tier_ctx.obj, tier_ctx.o.meta.mtime); readf.init(); diff --git a/src/rgw/rgw_lc_tier.h b/src/rgw/rgw_lc_tier.h index 86df479e8280..ed0e826509ac 100644 --- a/src/rgw/rgw_lc_tier.h +++ b/src/rgw/rgw_lc_tier.h @@ -25,7 +25,6 @@ struct RGWLCCloudTierCtx { std::string storage_class; rgw::sal::Object *obj; - RGWObjectCtx& rctx; /* Remote */ RGWRESTConn& conn; @@ -42,10 +41,10 @@ struct RGWLCCloudTierCtx { RGWLCCloudTierCtx(CephContext* _cct, const DoutPrefixProvider *_dpp, rgw_bucket_dir_entry& _o, rgw::sal::Store *_store, RGWBucketInfo &_binfo, rgw::sal::Object *_obj, - RGWObjectCtx& _rctx, RGWRESTConn& _conn, std::string& _bucket, + RGWRESTConn& _conn, std::string& _bucket, std::string& _storage_class) : cct(_cct), dpp(_dpp), o(_o), store(_store), bucket_info(_binfo), - obj(_obj), rctx(_rctx), conn(_conn), target_bucket_name(_bucket), + obj(_obj), conn(_conn), target_bucket_name(_bucket), target_storage_class(_storage_class) {} }; diff --git a/src/rgw/rgw_lib.h b/src/rgw/rgw_lib.h index 0c5e9e721685..4f3bd0205cce 100644 --- a/src/rgw/rgw_lib.h +++ b/src/rgw/rgw_lib.h @@ -160,13 +160,12 @@ namespace rgw { using RGWHandler::init; - int init(const RGWEnv& rgw_env, RGWObjectCtx* rados_ctx, + int init(const RGWEnv& rgw_env, rgw::sal::Store* _store, RGWLibIO* io, struct req_state* _s) { RGWRequest::init_state(_s); - RGWHandler::init(rados_ctx->get_store(), _s, io); + RGWHandler::init(_store, _s, io); - get_state()->obj_ctx = rados_ctx; get_state()->req_id = store->zone_unique_id(id); get_state()->trans_id = store->zone_unique_trans_id(id); get_state()->bucket_tenant = tuser->get_tenant(); @@ -177,7 +176,7 @@ namespace rgw { int ret = header_init(); if (ret == 0) { - ret = init_from_header(rados_ctx->get_store(), _s); + ret = init_from_header(store, _s); } return ret; } @@ -191,21 +190,18 @@ namespace rgw { class RGWLibContinuedReq : public RGWLibRequest { RGWLibIO io_ctx; struct req_state rstate; - RGWObjectCtx rados_ctx; public: RGWLibContinuedReq(CephContext* _cct, std::unique_ptr _user) : RGWLibRequest(_cct, std::move(_user)), io_ctx(), - rstate(_cct, &io_ctx.get_env(), id), - rados_ctx(rgwlib.get_store(), &rstate) + rstate(_cct, &io_ctx.get_env(), id) { io_ctx.init(_cct); RGWRequest::init_state(&rstate); - RGWHandler::init(rados_ctx.get_store(), &rstate, &io_ctx); + RGWHandler::init(rgwlib.get_store(), &rstate, &io_ctx); - get_state()->obj_ctx = &rados_ctx; get_state()->req_id = store->zone_unique_id(id); get_state()->trans_id = store->zone_unique_trans_id(id); @@ -215,7 +211,6 @@ namespace rgw { inline rgw::sal::Store* get_store() { return store; } inline RGWLibIO& get_io() { return io_ctx; } - inline RGWObjectCtx& get_octx() { return rados_ctx; } virtual int execute() final { ceph_abort(); } virtual int exec_start() = 0; diff --git a/src/rgw/rgw_notify.cc b/src/rgw/rgw_notify.cc index 57c028479b4b..aa02cf85aac1 100644 --- a/src/rgw/rgw_notify.cc +++ b/src/rgw/rgw_notify.cc @@ -624,7 +624,7 @@ rgw::sal::Object* get_object_with_atttributes( if (!src_obj->get_bucket()) { src_obj->set_bucket(res.bucket); } - if (src_obj->get_obj_attrs(res.obj_ctx, res.yield, res.dpp) < 0) { + if (src_obj->get_obj_attrs(res.yield, res.dpp) < 0) { return nullptr; } } @@ -966,7 +966,7 @@ reservation_t::reservation_t(const DoutPrefixProvider* _dpp, rgw::sal::Object* _object, rgw::sal::Object* _src_object, const std::string* _object_name) : - dpp(_s), store(_store), s(_s), size(0) /* XXX */, obj_ctx(_s->obj_ctx), + dpp(_s), store(_store), s(_s), size(0) /* XXX */, object(_object), src_object(_src_object), bucket(_s->bucket.get()), object_name(_object_name), tagset(_s->tagset), @@ -979,7 +979,6 @@ reservation_t::reservation_t(const DoutPrefixProvider* _dpp, reservation_t::reservation_t(const DoutPrefixProvider* _dpp, rgw::sal::RadosStore* _store, - RGWObjectCtx* _obj_ctx, rgw::sal::Object* _object, rgw::sal::Object* _src_object, rgw::sal::Bucket* _bucket, @@ -988,7 +987,6 @@ reservation_t::reservation_t(const DoutPrefixProvider* _dpp, std::string& _req_id, optional_yield y) : dpp(_dpp), store(_store), s(nullptr), size(0) /* XXX */, - obj_ctx(_obj_ctx), object(_object), src_object(_src_object), bucket(_bucket), object_name(nullptr), user_id(_user_id), diff --git a/src/rgw/rgw_notify.h b/src/rgw/rgw_notify.h index 44e16f751efb..88c85340b975 100644 --- a/src/rgw/rgw_notify.h +++ b/src/rgw/rgw_notify.h @@ -58,7 +58,6 @@ struct reservation_t { rgw::sal::RadosStore* const store; const req_state* const s; size_t size; - RGWObjectCtx* obj_ctx; rgw::sal::Object* const object; rgw::sal::Object* const src_object; // may differ from object rgw::sal::Bucket* const bucket; @@ -81,7 +80,6 @@ struct reservation_t { /* ctor for non-request caller (e.g., lifecycle) */ reservation_t(const DoutPrefixProvider* _dpp, rgw::sal::RadosStore* _store, - RGWObjectCtx* _obj_ctx, rgw::sal::Object* _object, rgw::sal::Object* _src_object, rgw::sal::Bucket* _bucket, diff --git a/src/rgw/rgw_obj_manifest.h b/src/rgw/rgw_obj_manifest.h index a3d82a66808b..0c285e977842 100644 --- a/src/rgw/rgw_obj_manifest.h +++ b/src/rgw/rgw_obj_manifest.h @@ -608,48 +608,3 @@ public: }; }; WRITE_CLASS_ENCODER(RGWObjManifest) - -struct RGWObjState { - rgw_obj obj; - bool is_atomic{false}; - bool has_attrs{false}; - bool exists{false}; - uint64_t size{0}; //< size of raw object - uint64_t accounted_size{0}; //< size before compression, encryption - ceph::real_time mtime; - uint64_t epoch{0}; - bufferlist obj_tag; - bufferlist tail_tag; - std::string write_tag; - bool fake_tag{false}; - std::optional manifest; - std::string shadow_obj; - bool has_data{false}; - bufferlist data; - bool prefetch_data{false}; - bool keep_tail{false}; - bool is_olh{false}; - bufferlist olh_tag; - uint64_t pg_ver{false}; - uint32_t zone_short_id{0}; - bool compressed{false}; - - /* important! don't forget to update copy constructor */ - - RGWObjVersionTracker objv_tracker; - - std::map attrset; - - RGWObjState(); - RGWObjState(const RGWObjState& rhs); - ~RGWObjState(); - - bool get_attr(std::string name, bufferlist& dest) { - std::map::iterator iter = attrset.find(name); - if (iter != attrset.end()) { - dest = iter->second; - return true; - } - return false; - } -}; diff --git a/src/rgw/rgw_object_expirer_core.cc b/src/rgw/rgw_object_expirer_core.cc index 370001bff993..45a2feff2e45 100644 --- a/src/rgw/rgw_object_expirer_core.cc +++ b/src/rgw/rgw_object_expirer_core.cc @@ -212,16 +212,14 @@ int RGWObjectExpirer::garbage_single_object(const DoutPrefixProvider *dpp, objex return ret; } - RGWObjectCtx rctx(store); - rgw_obj_key key = hint.obj_key; if (key.instance.empty()) { key.instance = "null"; } std::unique_ptr obj = bucket->get_object(key); - obj->set_atomic(&rctx); - ret = obj->delete_object(dpp, &rctx, null_yield); + obj->set_atomic(); + ret = obj->delete_object(dpp, null_yield); return ret; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 89dbe92a2c8c..aba72b261f74 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -245,7 +245,6 @@ int rgw_op_get_bucket_policy_from_attr(const DoutPrefixProvider *dpp, static int get_obj_policy_from_attr(const DoutPrefixProvider *dpp, CephContext *cct, rgw::sal::Store* store, - RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, map& bucket_attrs, RGWAccessControlPolicy *policy, @@ -256,7 +255,7 @@ static int get_obj_policy_from_attr(const DoutPrefixProvider *dpp, bufferlist bl; int ret = 0; - std::unique_ptr rop = obj->get_read_op(&obj_ctx); + std::unique_ptr rop = obj->get_read_op(); ret = rop->get_attr(dpp, RGW_ATTR_ACL, bl, y); if (ret >= 0) { @@ -396,9 +395,9 @@ static int read_obj_policy(const DoutPrefixProvider *dpp, } policy = get_iam_policy_from_attr(s->cct, bucket_attrs, bucket->get_tenant()); - RGWObjectCtx *obj_ctx = static_cast(s->obj_ctx); - int ret = get_obj_policy_from_attr(dpp, s->cct, store, *obj_ctx, - bucket_info, bucket_attrs, acl, storage_class, object, s->yield); + int ret = get_obj_policy_from_attr(dpp, s->cct, store, bucket_info, + bucket_attrs, acl, storage_class, object, + s->yield); if (ret == -ENOENT) { /* object does not exist checking the bucket's ACL to make sure that we send a proper error code */ @@ -663,9 +662,9 @@ int rgw_build_object_policies(const DoutPrefixProvider *dpp, rgw::sal::Store* st } s->object_acl = std::make_unique(s->cct); - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); if (prefetch_data) { - s->object->set_prefetch_data(s->obj_ctx); + s->object->set_prefetch_data(); } ret = read_obj_policy(dpp, store, s, s->bucket->get_info(), s->bucket_attrs, s->object_acl.get(), nullptr, s->iam_policy, s->bucket.get(), @@ -676,8 +675,8 @@ int rgw_build_object_policies(const DoutPrefixProvider *dpp, rgw::sal::Store* st } static int rgw_iam_remove_objtags(const DoutPrefixProvider *dpp, struct req_state* s, rgw::sal::Object* object, bool has_existing_obj_tag, bool has_resource_tag) { - object->set_atomic(s->obj_ctx); - int op_ret = object->get_obj_attrs(s->obj_ctx, s->yield, dpp); + object->set_atomic(); + int op_ret = object->get_obj_attrs(s->yield, dpp); if (op_ret < 0) return op_ret; rgw::sal::Attrs attrs = object->get_attrs(); @@ -752,8 +751,8 @@ static int rgw_iam_add_tags_from_bl(struct req_state* s, bufferlist& bl, bool ha } static int rgw_iam_add_objtags(const DoutPrefixProvider *dpp, struct req_state* s, rgw::sal::Object* object, bool has_existing_obj_tag, bool has_resource_tag) { - object->set_atomic(s->obj_ctx); - int op_ret = object->get_obj_attrs(s->obj_ctx, s->yield, dpp); + object->set_atomic(); + int op_ret = object->get_obj_attrs(s->yield, dpp); if (op_ret < 0) return op_ret; rgw::sal::Attrs attrs = object->get_attrs(); @@ -956,10 +955,10 @@ int retry_raced_bucket_write(const DoutPrefixProvider *dpp, rgw::sal::Bucket* b, int RGWGetObj::verify_permission(optional_yield y) { - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); if (prefetch_data()) { - s->object->set_prefetch_data(s->obj_ctx); + s->object->set_prefetch_data(); } auto [has_s3_existing_tag, has_s3_resource_tag] = rgw_check_policy_condition(this, s); @@ -1038,9 +1037,9 @@ void RGWGetObjTags::execute(optional_yield y) { rgw::sal::Attrs attrs; - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); - op_ret = s->object->get_obj_attrs(s->obj_ctx, y, this); + op_ret = s->object->get_obj_attrs(y, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << s->object << " ret=" << op_ret << dendl; @@ -1084,8 +1083,8 @@ void RGWPutObjTags::execute(optional_yield y) return; } - s->object->set_atomic(s->obj_ctx); - op_ret = s->object->modify_obj_attrs(s->obj_ctx, RGW_ATTR_TAGS, tags_bl, y, this); + s->object->set_atomic(); + op_ret = s->object->modify_obj_attrs(RGW_ATTR_TAGS, tags_bl, y, this); if (op_ret == -ECANCELED){ op_ret = -ERR_TAG_CONFLICT; } @@ -1118,7 +1117,7 @@ void RGWDeleteObjTags::execute(optional_yield y) if (rgw::sal::Object::empty(s->object.get())) return; - op_ret = s->object->delete_obj_attrs(this, s->obj_ctx, RGW_ATTR_TAGS, y); + op_ret = s->object->delete_obj_attrs(this, RGW_ATTR_TAGS, y); } int RGWGetBucketTags::verify_permission(optional_yield y) @@ -1560,16 +1559,15 @@ int RGWGetObj::read_user_manifest_part(rgw::sal::Bucket* bucket, std::unique_ptr part = bucket->get_object(ent.key); - RGWObjectCtx obj_ctx(store); RGWAccessControlPolicy obj_policy(s->cct); ldpp_dout(this, 20) << "reading obj=" << part << " ofs=" << cur_ofs << " end=" << cur_end << dendl; - part->set_atomic(&obj_ctx); - part->set_prefetch_data(&obj_ctx); + part->set_atomic(); + part->set_prefetch_data(); - std::unique_ptr read_op = part->get_read_op(&obj_ctx); + std::unique_ptr read_op = part->get_read_op(); if (!swift_slo) { /* SLO etag is optional */ @@ -2129,7 +2127,7 @@ void RGWGetObj::execute(optional_yield y) perfcounter->inc(l_rgw_get); - std::unique_ptr read_op(s->object->get_read_op(s->obj_ctx)); + std::unique_ptr read_op(s->object->get_read_op()); op_ret = get_params(y); if (op_ret < 0) @@ -3552,8 +3550,8 @@ int RGWPutObj::verify_permission(optional_yield y) std::unique_ptr cs_object = cs_bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); - cs_object->set_atomic(s->obj_ctx); - cs_object->set_prefetch_data(s->obj_ctx); + cs_object->set_atomic(); + cs_object->set_prefetch_data(); /* check source object permissions */ if (ret = read_obj_policy(this, store, s, copy_source_bucket_info, cs_attrs, &cs_acl, nullptr, @@ -3751,7 +3749,7 @@ int RGWPutObj::get_data(const off_t fst, const off_t lst, bufferlist& bl) return ret; std::unique_ptr obj = bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); - std::unique_ptr read_op(obj->get_read_op(s->obj_ctx)); + std::unique_ptr read_op(obj->get_read_op()); ret = read_op->prepare(s->yield, this); if (ret < 0) @@ -3894,11 +3892,10 @@ void RGWPutObj::execute(optional_yield y) } const bool multipart = !multipart_upload_id.empty(); - auto& obj_ctx = *static_cast(s->obj_ctx); /* Handle object versioning of Swift API. */ if (! multipart) { - op_ret = s->object->swift_versioning_copy(s->obj_ctx, this, s->yield); + op_ret = s->object->swift_versioning_copy(this, s->yield); if (op_ret < 0) { return; } @@ -3927,7 +3924,7 @@ void RGWPutObj::execute(optional_yield y) std::unique_ptr upload; upload = s->bucket->get_multipart_upload(s->object->get_name(), multipart_upload_id); - op_ret = upload->get_info(this, s->yield, s->obj_ctx, &pdest_placement); + op_ret = upload->get_info(this, s->yield, &pdest_placement); s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, multipart_upload_id); multipart_trace = tracing::rgw::tracer.add_span(name(), upload->get_trace()); @@ -3945,7 +3942,7 @@ void RGWPutObj::execute(optional_yield y) pdest_placement = &s->dest_placement; ldpp_dout(this, 20) << "dest_placement for part=" << *pdest_placement << dendl; processor = upload->get_writer(this, s->yield, s->object->clone(), - s->user->get_id(), obj_ctx, pdest_placement, + s->user->get_id(), pdest_placement, multipart_part_num, multipart_part_str); } else if(append) { if (s->bucket->versioned()) { @@ -3953,7 +3950,7 @@ void RGWPutObj::execute(optional_yield y) return; } processor = store->get_append_writer(this, s->yield, s->object->clone(), - s->bucket_owner.get_id(), obj_ctx, + s->bucket_owner.get_id(), pdest_placement, s->req_id, position, &cur_accounted_size); } else { @@ -3966,7 +3963,7 @@ void RGWPutObj::execute(optional_yield y) } } processor = store->get_atomic_writer(this, s->yield, s->object->clone(), - s->bucket_owner.get_id(), obj_ctx, + s->bucket_owner.get_id(), pdest_placement, olh_epoch, s->req_id); } @@ -3987,7 +3984,7 @@ void RGWPutObj::execute(optional_yield y) bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); RGWObjState *astate; - op_ret = obj->get_obj_state(this, &obj_ctx, &astate, s->yield); + op_ret = obj->get_obj_state(this, &astate, s->yield); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: get copy source obj state returned with error" << op_ret << dendl; return; @@ -4039,7 +4036,7 @@ void RGWPutObj::execute(optional_yield y) compressor.emplace(s->cct, plugin, filter); filter = &*compressor; // always send incompressible hint when rgw is itself doing compression - s->object->set_compressed(s->obj_ctx); + s->object->set_compressed(); } } } @@ -4356,7 +4353,7 @@ void RGWPostObj::execute(optional_yield y) std::unique_ptr processor; processor = store->get_atomic_writer(this, s->yield, std::move(obj), - s->bucket_owner.get_id(), *s->obj_ctx, + s->bucket_owner.get_id(), &s->dest_placement, 0, s->req_id); op_ret = processor->prepare(s->yield); if (op_ret < 0) { @@ -4725,7 +4722,7 @@ void RGWPutMetadataObject::execute(optional_yield y) rgw_obj target_obj; rgw::sal::Attrs attrs, rmattrs; - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); op_ret = get_params(y); if (op_ret < 0) { @@ -4738,7 +4735,7 @@ void RGWPutMetadataObject::execute(optional_yield y) } /* check if obj exists, read orig attrs */ - op_ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, s, &target_obj); + op_ret = s->object->get_obj_attrs(s->yield, s, &target_obj); if (op_ret < 0) { return; } @@ -4763,7 +4760,7 @@ void RGWPutMetadataObject::execute(optional_yield y) } } - op_ret = s->object->set_obj_attrs(this, s->obj_ctx, &attrs, &rmattrs, s->yield, &target_obj); + op_ret = s->object->set_obj_attrs(this, &attrs, &rmattrs, s->yield); } int RGWDeleteObj::handle_slo_manifest(bufferlist& bl, optional_yield y) @@ -4929,12 +4926,11 @@ void RGWDeleteObj::execute(optional_yield y) if (!rgw::sal::Object::empty(s->object.get())) { uint64_t obj_size = 0; std::string etag; - RGWObjectCtx* obj_ctx = static_cast(s->obj_ctx); { RGWObjState* astate = nullptr; bool check_obj_lock = s->object->have_instance() && s->bucket->get_info().obj_lock_enabled(); - op_ret = s->object->get_obj_state(this, obj_ctx, &astate, s->yield, true); + op_ret = s->object->get_obj_state(this, &astate, s->yield, true); if (op_ret < 0) { if (need_object_expiration() || multipart_delete) { return; @@ -5004,10 +5000,10 @@ void RGWDeleteObj::execute(optional_yield y) return; } - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); bool ver_restored = false; - op_ret = s->object->swift_versioning_restore(s->obj_ctx, ver_restored, this); + op_ret = s->object->swift_versioning_restore(ver_restored, this); if (op_ret < 0) { return; } @@ -5023,7 +5019,7 @@ void RGWDeleteObj::execute(optional_yield y) return; } - std::unique_ptr del_op = s->object->get_delete_op(obj_ctx); + std::unique_ptr del_op = s->object->get_delete_op(); del_op->params.obj_owner = s->owner; del_op->params.bucket_owner = s->bucket_owner; del_op->params.versioning_status = s->bucket->get_info().versioning_status(); @@ -5137,8 +5133,8 @@ int RGWCopyObj::verify_permission(optional_yield y) s->src_object->set_bucket(src_bucket.get()); /* get buckets info (source and dest) */ if (s->local_source && source_zone.empty()) { - s->src_object->set_atomic(s->obj_ctx); - s->src_object->set_prefetch_data(s->obj_ctx); + s->src_object->set_atomic(); + s->src_object->set_prefetch_data(); rgw_placement_rule src_placement; @@ -5248,7 +5244,7 @@ int RGWCopyObj::verify_permission(optional_yield y) } dest_object = dest_bucket->get_object(rgw_obj_key(dest_obj_name)); - dest_object->set_atomic(s->obj_ctx); + dest_object->set_atomic(); /* check dest bucket permissions */ op_ret = read_bucket_policy(this, store, s, dest_bucket->get_info(), @@ -5413,8 +5409,8 @@ void RGWCopyObj::execute(optional_yield y) dest_object->gen_rand_obj_instance_name(); } - s->src_object->set_atomic(s->obj_ctx); - dest_object->set_atomic(s->obj_ctx); + s->src_object->set_atomic(); + dest_object->set_atomic(); encode_delete_at_attr(delete_at, attrs); @@ -5433,7 +5429,7 @@ void RGWCopyObj::execute(optional_yield y) { // get src object size (cached in obj_ctx from verify_permission()) RGWObjState* astate = nullptr; - op_ret = s->src_object->get_obj_state(this, s->obj_ctx, &astate, s->yield, true); + op_ret = s->src_object->get_obj_state(this, &astate, s->yield, true); if (op_ret < 0) { return; } @@ -5471,14 +5467,12 @@ void RGWCopyObj::execute(optional_yield y) /* Handle object versioning of Swift API. In case of copying to remote this * should fail gently (op_ret == 0) as the dst_obj will not exist here. */ - op_ret = dest_object->swift_versioning_copy(s->obj_ctx, this, s->yield); + op_ret = dest_object->swift_versioning_copy(this, s->yield); if (op_ret < 0) { return; } - RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); - op_ret = s->src_object->copy_object(obj_ctx, - s->user.get(), + op_ret = s->src_object->copy_object(s->user.get(), &s->info, source_zone, dest_object.get(), @@ -5760,9 +5754,9 @@ void RGWPutACLs::execute(optional_yield y) map attrs; if (!rgw::sal::Object::empty(s->object.get())) { - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); //if instance is empty, we should modify the latest object - op_ret = s->object->modify_obj_attrs(s->obj_ctx, RGW_ATTR_ACL, bl, s->yield, this); + op_ret = s->object->modify_obj_attrs(RGW_ATTR_ACL, bl, s->yield, this); } else { map attrs = s->bucket_attrs; attrs[RGW_ATTR_ACL] = bl; @@ -6190,7 +6184,7 @@ void RGWInitMultipart::execute(optional_yield y) std::unique_ptr upload; upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id); - op_ret = upload->init(this, s->yield, s->obj_ctx, s->owner, s->dest_placement, attrs); + op_ret = upload->init(this, s->yield, s->owner, s->dest_placement, attrs); if (op_ret == 0) { upload_id = upload->get_upload_id(); @@ -6352,7 +6346,7 @@ void RGWCompleteMultipart::execute(optional_yield y) return; } - op_ret = meta_obj->get_obj_attrs(s->obj_ctx, s->yield, this); + op_ret = meta_obj->get_obj_attrs(s->yield, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << meta_obj << " ret=" << op_ret << dendl; @@ -6383,7 +6377,7 @@ void RGWCompleteMultipart::execute(optional_yield y) } target_obj->set_attrs(meta_obj->get_attrs()); - op_ret = upload->complete(this, y, s->cct, parts->parts, remove_objs, accounted_size, compressed, cs_info, ofs, s->req_id, s->owner, olh_epoch, target_obj.get(), s->obj_ctx); + op_ret = upload->complete(this, y, s->cct, parts->parts, remove_objs, accounted_size, compressed, cs_info, ofs, s->req_id, s->owner, olh_epoch, target_obj.get()); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: upload complete failed ret=" << op_ret << dendl; return; @@ -6391,7 +6385,7 @@ void RGWCompleteMultipart::execute(optional_yield y) // remove the upload meta object ; the meta object is not versioned // when the bucket is, as that would add an unneeded delete marker - int r = meta_obj->delete_object(this, s->obj_ctx, y, true /* prevent versioning */); + int r = meta_obj->delete_object(this, y, true /* prevent versioning */); if (r >= 0) { /* serializer's exclusive lock is released */ serializer->clear_locked(); @@ -6410,7 +6404,7 @@ void RGWCompleteMultipart::execute(optional_yield y) bool RGWCompleteMultipart::check_previously_completed(const RGWMultiCompleteUpload* parts) { // re-calculate the etag from the parts and compare to the existing object - int ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, this); + int ret = s->object->get_obj_attrs(s->yield, this); if (ret < 0) { ldpp_dout(this, 0) << __func__ << "() ERROR: get_obj_attrs() returned ret=" << ret << dendl; return false; @@ -6539,19 +6533,17 @@ void RGWAbortMultipart::execute(optional_yield y) return; upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id); - RGWObjectCtx *obj_ctx = static_cast(s->obj_ctx); - jspan_context trace_ctx(false, false); if (tracing::rgw::tracer.is_enabled()) { // read meta object attributes for trace info meta_obj = upload->get_meta_obj(); meta_obj->set_in_extra_data(true); - meta_obj->get_obj_attrs(obj_ctx, s->yield, this); + meta_obj->get_obj_attrs(s->yield, this); extract_span_context(meta_obj->get_attrs(), trace_ctx); } multipart_trace = tracing::rgw::tracer.add_span(name(), trace_ctx); - op_ret = upload->abort(this, s->cct, obj_ctx); + op_ret = upload->abort(this, s->cct); } int RGWListMultipart::verify_permission(optional_yield y) @@ -6580,7 +6572,7 @@ void RGWListMultipart::execute(optional_yield y) upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id); rgw::sal::Attrs attrs; - op_ret = upload->get_info(this, s->yield, s->obj_ctx, &placement, &attrs); + op_ret = upload->get_info(this, s->yield, &placement, &attrs); /* decode policy */ map::iterator iter = attrs.find(RGW_ATTR_ACL); if (iter != attrs.end()) { @@ -6766,7 +6758,6 @@ void RGWDeleteMultiObj::execute(optional_yield y) RGWMultiDelDelete *multi_delete; vector::iterator iter; RGWMultiDelXMLParser parser; - RGWObjectCtx *obj_ctx = static_cast(s->obj_ctx); char* buf; buf = data.c_str(); @@ -6903,7 +6894,7 @@ void RGWDeleteMultiObj::execute(optional_yield y) if (!rgw::sal::Object::empty(obj.get())) { RGWObjState* astate = nullptr; bool check_obj_lock = obj->have_instance() && bucket->get_info().obj_lock_enabled(); - const auto ret = obj->get_obj_state(this, obj_ctx, &astate, s->yield, true); + const auto ret = obj->get_obj_state(this, &astate, s->yield, true); if (ret < 0) { if (ret == -ENOENT) { @@ -6942,9 +6933,9 @@ void RGWDeleteMultiObj::execute(optional_yield y) continue; } - obj->set_atomic(obj_ctx); + obj->set_atomic(); - std::unique_ptr del_op = obj->get_delete_op(obj_ctx); + std::unique_ptr del_op = obj->get_delete_op(); del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status(); del_op->params.obj_owner = s->owner; del_op->params.bucket_owner = s->bucket_owner; @@ -7027,9 +7018,9 @@ bool RGWBulkDelete::Deleter::delete_single(const acct_path_t& path, optional_yie bucket_owner.set_id(bucket->get_info().owner); std::unique_ptr obj = bucket->get_object(path.obj_key); - obj->set_atomic(s->obj_ctx); + obj->set_atomic(); - std::unique_ptr del_op = obj->get_delete_op(s->obj_ctx); + std::unique_ptr del_op = obj->get_delete_op(); del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status(); del_op->params.obj_owner = bowner; del_op->params.bucket_owner = bucket_owner; @@ -7387,7 +7378,6 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, rgw_obj_key object; std::tie(bucket_name, object) = *parse_path(path); - auto& obj_ctx = *static_cast(s->obj_ctx); std::unique_ptr bucket; ACLOwner bowner; @@ -7423,7 +7413,7 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, std::unique_ptr processor; processor = store->get_atomic_writer(this, s->yield, std::move(obj), - bowner.get_id(), obj_ctx, + bowner.get_id(), &s->dest_placement, 0, s->req_id); op_ret = processor->prepare(s->yield); if (op_ret < 0) { @@ -7663,7 +7653,7 @@ ssize_t RGWBulkUploadOp::AlignedStreamGetter::get_exactly(const size_t want, int RGWGetAttrs::verify_permission(optional_yield y) { - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); auto [has_s3_existing_tag, has_s3_resource_tag] = rgw_check_policy_condition(this, s); if (has_s3_existing_tag || has_s3_resource_tag) @@ -7691,9 +7681,9 @@ void RGWGetAttrs::execute(optional_yield y) if (op_ret < 0) return; - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); - op_ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, this); + op_ret = s->object->get_obj_attrs(s->yield, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << s->object << " ret=" << op_ret << dendl; @@ -7747,9 +7737,9 @@ void RGWRMAttrs::execute(optional_yield y) if (op_ret < 0) return; - s->object->set_atomic(s->obj_ctx); + s->object->set_atomic(); - op_ret = s->object->set_obj_attrs(this, s->obj_ctx, nullptr, &attrs, y); + op_ret = s->object->set_obj_attrs(this, nullptr, &attrs, y); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to delete obj attrs, obj=" << s->object << " ret=" << op_ret << dendl; @@ -7786,7 +7776,7 @@ void RGWSetAttrs::execute(optional_yield y) if (!rgw::sal::Object::empty(s->object.get())) { rgw::sal::Attrs a(attrs); - op_ret = s->object->set_obj_attrs(this, s->obj_ctx, &a, nullptr, y); + op_ret = s->object->set_obj_attrs(this, &a, nullptr, y); } else { op_ret = s->bucket->merge_and_store_attrs(this, attrs, y); } @@ -8257,7 +8247,7 @@ void RGWPutObjRetention::execute(optional_yield y) obj_retention.encode(bl); //check old retention - op_ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, this); + op_ret = s->object->get_obj_attrs(s->yield, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: get obj attr error"<< dendl; return; @@ -8292,7 +8282,7 @@ void RGWPutObjRetention::execute(optional_yield y) } } - op_ret = s->object->modify_obj_attrs(s->obj_ctx, RGW_ATTR_OBJECT_RETENTION, bl, s->yield, this); + op_ret = s->object->modify_obj_attrs(RGW_ATTR_OBJECT_RETENTION, bl, s->yield, this); return; } @@ -8322,7 +8312,7 @@ void RGWGetObjRetention::execute(optional_yield y) op_ret = -ERR_INVALID_REQUEST; return; } - op_ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, this); + op_ret = s->object->get_obj_attrs(s->yield, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << s->object << " ret=" << op_ret << dendl; @@ -8397,7 +8387,7 @@ void RGWPutObjLegalHold::execute(optional_yield y) { bufferlist bl; obj_legal_hold.encode(bl); //if instance is empty, we should modify the latest object - op_ret = s->object->modify_obj_attrs(s->obj_ctx, RGW_ATTR_OBJECT_LEGAL_HOLD, bl, s->yield, this); + op_ret = s->object->modify_obj_attrs(RGW_ATTR_OBJECT_LEGAL_HOLD, bl, s->yield, this); return; } @@ -8427,7 +8417,7 @@ void RGWGetObjLegalHold::execute(optional_yield y) return; } map attrs; - op_ret = s->object->get_obj_attrs(s->obj_ctx, s->yield, this); + op_ret = s->object->get_obj_attrs(s->yield, this); if (op_ret < 0) { ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << s->object << " ret=" << op_ret << dendl; diff --git a/src/rgw/rgw_orphan.cc b/src/rgw/rgw_orphan.cc index 874061306b65..6c942df80136 100644 --- a/src/rgw/rgw_orphan.cc +++ b/src/rgw/rgw_orphan.cc @@ -580,9 +580,9 @@ int RGWOrphanSearch::build_linked_oids_for_bucket(const DoutPrefixProvider *dpp, continue; } - rgw_obj obj(cur_bucket->get_key(), entry.key); + std::unique_ptr obj = cur_bucket->get_object(entry.key); - RGWRados::Object op_target(store->getRados(), cur_bucket->get_info(), obj_ctx, obj); + RGWRados::Object op_target(store->getRados(), cur_bucket.get(), obj_ctx, obj.get()); stat_ops.push_back(RGWRados::Object::Stat(&op_target)); RGWRados::Object::Stat& op = stat_ops.back(); @@ -1244,14 +1244,16 @@ int RGWRadosList::process_bucket( continue; } + std::unique_ptr bucket; + store->get_bucket(nullptr, bucket_info, &bucket); // we need to do this in two cases below, so use a lambda auto do_stat_key = [&](const rgw_obj_key& key) -> int { int ret; - rgw_obj obj(bucket_info.bucket, key); - RGWRados::Object op_target(store->getRados(), bucket_info, - obj_ctx, obj); + std::unique_ptr obj = bucket->get_object(key); + RGWRados::Object op_target(store->getRados(), bucket.get(), + obj_ctx, obj.get()); stat_ops.push_back(RGWRados::Object::Stat(&op_target)); RGWRados::Object::Stat& op = stat_ops.back(); diff --git a/src/rgw/rgw_process.cc b/src/rgw/rgw_process.cc index f8d43a3258d2..77ef102d30c1 100644 --- a/src/rgw/rgw_process.cc +++ b/src/rgw/rgw_process.cc @@ -290,9 +290,6 @@ int process_request(rgw::sal::Store* const store, std::unique_ptr u = store->get_user(rgw_user()); s->set_user(u); - RGWObjectCtx rados_ctx(store, s); - s->obj_ctx = &rados_ctx; - if (ret < 0) { s->cio = client_io; abort_early(s, nullptr, ret, nullptr, yield); diff --git a/src/rgw/rgw_pubsub.cc b/src/rgw/rgw_pubsub.cc index 67b9fa41446c..50073eeaff5b 100644 --- a/src/rgw/rgw_pubsub.cc +++ b/src/rgw/rgw_pubsub.cc @@ -936,28 +936,24 @@ int RGWPubSub::SubWithEvents::remove_event(const DoutPrefixProvider * return ret; } - RGWBucketInfo bucket_info; string tenant; - ret = store->getRados()->get_bucket_info(store->svc(), tenant, sub_conf.dest.bucket_name, bucket_info, nullptr, null_yield, nullptr); + std::unique_ptr bucket; + ret = store->get_bucket(dpp, nullptr, tenant, sub_conf.dest.bucket_name, + &bucket, null_yield); if (ret < 0) { ldpp_dout(dpp, 1) << "ERROR: failed to read bucket info for events bucket: bucket=" << sub_conf.dest.bucket_name << " ret=" << ret << dendl; return ret; } + std::unique_ptr obj = bucket->get_object( + sub_conf.dest.oid_prefix + event_id); + obj->set_atomic(); - rgw_bucket& bucket = bucket_info.bucket; - - RGWObjectCtx obj_ctx(store); - rgw_obj obj(bucket, sub_conf.dest.oid_prefix + event_id); - - obj_ctx.set_atomic(obj); - - RGWRados::Object del_target(store->getRados(), bucket_info, obj_ctx, obj); - RGWRados::Object::Delete del_op(&del_target); + std::unique_ptr del_op = obj->get_delete_op(); - del_op.params.bucket_owner = bucket_info.owner; - del_op.params.versioning_status = bucket_info.versioning_status(); + del_op->params.bucket_owner = bucket->get_info().owner; + del_op->params.versioning_status = bucket->get_info().versioning_status(); - ret = del_op.delete_obj(null_yield, dpp); + ret = del_op->delete_obj(dpp, null_yield); if (ret < 0) { ldpp_dout(dpp, 1) << "ERROR: failed to remove event (obj=" << obj << "): ret=" << ret << dendl; } diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 80d39794c830..8da8d2564d43 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -78,8 +78,8 @@ static int process_completed(const AioResultList& completed, RawObjSet *written) void RadosWriter::add_write_hint(librados::ObjectWriteOperation& op) { const rgw_obj obj = head_obj->get_obj(); - const RGWObjState *obj_state = obj_ctx.get_state(obj); - const bool compressed = obj_state->compressed; + const RGWObjStateManifest *sm = obj_ctx.get_state(obj); + const bool compressed = sm->state.compressed; uint32_t alloc_hint_flags = 0; if (compressed) { alloc_hint_flags |= librados::ALLOC_HINT_FLAG_INCOMPRESSIBLE; @@ -175,7 +175,7 @@ RadosWriter::~RadosWriter() if (need_to_remove_head) { std::string version_id; ldpp_dout(dpp, 5) << "NOTE: we are going to process the head obj (" << *raw_head << ")" << dendl; - int r = head_obj->delete_object(dpp, &obj_ctx, null_yield); + int r = head_obj->delete_object(dpp, null_yield); if (r < 0 && r != -ENOENT) { ldpp_dout(dpp, 0) << "WARNING: failed to remove obj (" << *raw_head << "), leaked" << dendl; } @@ -304,11 +304,11 @@ int AtomicObjectProcessor::complete(size_t accounted_size, return r; } - head_obj->set_atomic(&obj_ctx); + head_obj->set_atomic(); RGWRados::Object op_target(store->getRados(), - head_obj->get_bucket()->get_info(), - obj_ctx, head_obj->get_obj()); + head_obj->get_bucket(), + obj_ctx, head_obj.get()); RGWRados::Object::Write obj_op(&op_target); /* some object types shouldn't be versioned, e.g., multipart parts */ @@ -443,8 +443,8 @@ int MultipartObjectProcessor::complete(size_t accounted_size, } RGWRados::Object op_target(store->getRados(), - head_obj->get_bucket()->get_info(), - obj_ctx, head_obj->get_obj()); + head_obj->get_bucket(), + obj_ctx, head_obj.get()); RGWRados::Object::Write obj_op(&op_target); op_target.set_versioning_disabled(true); @@ -520,7 +520,7 @@ int AppendObjectProcessor::process_first_chunk(bufferlist &&data, rgw::sal::Data int AppendObjectProcessor::prepare(optional_yield y) { RGWObjState *astate; - int r = head_obj->get_obj_state(dpp, &obj_ctx, &astate, y); + int r = head_obj->get_obj_state(dpp, &astate, y); if (r < 0) { return r; } @@ -572,7 +572,7 @@ int AppendObjectProcessor::prepare(optional_yield y) if (iter != astate->attrset.end()) { tail_placement_rule.storage_class = iter->second.to_str(); } - cur_manifest = &(*astate->manifest); + cur_manifest = dynamic_cast(head_obj.get())->get_manifest(); manifest.set_prefix(cur_manifest->get_prefix()); astate->keep_tail = true; } @@ -622,10 +622,10 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c if (r < 0) { return r; } - head_obj->set_atomic(&obj_ctx); + head_obj->set_atomic(); RGWRados::Object op_target(store->getRados(), - head_obj->get_bucket()->get_info(), - obj_ctx, head_obj->get_obj()); + head_obj->get_bucket(), + obj_ctx, head_obj.get()); RGWRados::Object::Write obj_op(&op_target); //For Append obj, disable versioning op_target.set_versioning_disabled(true); diff --git a/src/rgw/rgw_putobj_processor.h b/src/rgw/rgw_putobj_processor.h index 5aa4d6233987..1beb9a724c05 100644 --- a/src/rgw/rgw_putobj_processor.h +++ b/src/rgw/rgw_putobj_processor.h @@ -132,13 +132,13 @@ class ManifestObjectProcessor : public HeadObjectProcessor, public: ManifestObjectProcessor(Aio *aio, rgw::sal::RadosStore* store, const rgw_placement_rule *ptail_placement_rule, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, RGWObjectCtx& _obj_ctx, std::unique_ptr _head_obj, const DoutPrefixProvider* dpp, optional_yield y) : HeadObjectProcessor(0), store(store), owner(owner), - obj_ctx(obj_ctx), head_obj(std::move(_head_obj)), + obj_ctx(_obj_ctx), head_obj(std::move(_head_obj)), writer(aio, store, obj_ctx, head_obj->clone(), dpp, y), chunk(&writer, 0), stripe(&chunk, this, 0), dpp(dpp) { if (ptail_placement_rule) { diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 6cc26a99bd9f..755df18354c2 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -201,45 +201,9 @@ void RGWObjVersionTracker::apply_write() write_version = obj_version(); } -RGWObjState::RGWObjState() { -} - -RGWObjState::~RGWObjState() { -} - -RGWObjState::RGWObjState(const RGWObjState& rhs) : obj (rhs.obj) { - is_atomic = rhs.is_atomic; - has_attrs = rhs.has_attrs; - exists = rhs.exists; - size = rhs.size; - accounted_size = rhs.accounted_size; - mtime = rhs.mtime; - epoch = rhs.epoch; - if (rhs.obj_tag.length()) { - obj_tag = rhs.obj_tag; - } - if (rhs.tail_tag.length()) { - tail_tag = rhs.tail_tag; - } - write_tag = rhs.write_tag; - fake_tag = rhs.fake_tag; - manifest = rhs.manifest; - shadow_obj = rhs.shadow_obj; - has_data = rhs.has_data; - if (rhs.data.length()) { - data = rhs.data; - } - prefetch_data = rhs.prefetch_data; - keep_tail = rhs.keep_tail; - is_olh = rhs.is_olh; - objv_tracker = rhs.objv_tracker; - pg_ver = rhs.pg_ver; - compressed = rhs.compressed; -} - -RGWObjState *RGWObjectCtx::get_state(const rgw_obj& obj) { - RGWObjState *result; - typename std::map::iterator iter; +RGWObjStateManifest *RGWObjectCtx::get_state(const rgw_obj& obj) { + RGWObjStateManifest *result; + typename std::map::iterator iter; lock.lock_shared(); assert (!obj.empty()); iter = objs_state.find(obj); @@ -258,18 +222,18 @@ RGWObjState *RGWObjectCtx::get_state(const rgw_obj& obj) { void RGWObjectCtx::set_compressed(const rgw_obj& obj) { std::unique_lock wl{lock}; assert (!obj.empty()); - objs_state[obj].compressed = true; + objs_state[obj].state.compressed = true; } void RGWObjectCtx::set_atomic(rgw_obj& obj) { std::unique_lock wl{lock}; assert (!obj.empty()); - objs_state[obj].is_atomic = true; + objs_state[obj].state.is_atomic = true; } void RGWObjectCtx::set_prefetch_data(const rgw_obj& obj) { std::unique_lock wl{lock}; assert (!obj.empty()); - objs_state[obj].prefetch_data = true; + objs_state[obj].state.prefetch_data = true; } void RGWObjectCtx::invalidate(const rgw_obj& obj) { @@ -278,17 +242,17 @@ void RGWObjectCtx::invalidate(const rgw_obj& obj) { if (iter == objs_state.end()) { return; } - bool is_atomic = iter->second.is_atomic; - bool prefetch_data = iter->second.prefetch_data; - bool compressed = iter->second.compressed; + bool is_atomic = iter->second.state.is_atomic; + bool prefetch_data = iter->second.state.prefetch_data; + bool compressed = iter->second.state.compressed; objs_state.erase(iter); - if (is_atomic || prefetch_data || compressed) { - auto& state = objs_state[obj]; - state.is_atomic = is_atomic; - state.prefetch_data = prefetch_data; - state.compressed = compressed; + if (is_atomic || prefetch_data) { + auto& sm = objs_state[obj]; + sm.state.is_atomic = is_atomic; + sm.state.prefetch_data = prefetch_data; + sm.state.compressed = compressed; } } @@ -2678,35 +2642,36 @@ done_err: */ int RGWRados::fix_tail_obj_locator(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, rgw_obj_key& key, bool fix, bool *need_fix, optional_yield y) { - const rgw_bucket& bucket = bucket_info.bucket; - rgw_obj obj(bucket, key); + std::unique_ptr bucket; + store->get_bucket(nullptr, bucket_info, &bucket); + std::unique_ptr obj = bucket->get_object(key); if (need_fix) { *need_fix = false; } rgw_rados_ref ref; - int r = get_obj_head_ref(dpp, bucket_info, obj, &ref); + int r = get_obj_head_ref(dpp, bucket_info, obj->get_obj(), &ref); if (r < 0) { return r; } - RGWObjState *astate = NULL; + RGWObjState *astate = nullptr; + RGWObjManifest* manifest = nullptr; RGWObjectCtx rctx(this->store); - r = get_obj_state(dpp, &rctx, bucket_info, obj, &astate, false, y); + r = get_obj_state(dpp, &rctx, bucket_info, obj.get(), &astate, &manifest, false, y); if (r < 0) return r; - if (astate->manifest) { + if (manifest) { RGWObjManifest::obj_iterator miter; - RGWObjManifest& manifest = *astate->manifest; - for (miter = manifest.obj_begin(dpp); miter != manifest.obj_end(dpp); ++miter) { + for (miter = manifest->obj_begin(dpp); miter != manifest->obj_end(dpp); ++miter) { rgw_raw_obj raw_loc = miter.get_location().get_raw_obj(store); rgw_obj loc; string oid; string locator; - RGWSI_Tier_RADOS::raw_obj_to_obj(manifest.get_tail_placement().bucket, raw_loc, &loc); + RGWSI_Tier_RADOS::raw_obj_to_obj(manifest->get_tail_placement().bucket, raw_loc, &loc); if (loc.key.ns.empty()) { /* continue, we're only interested in tail objects */ @@ -2726,7 +2691,7 @@ int RGWRados::fix_tail_obj_locator(const DoutPrefixProvider *dpp, const RGWBucke } string bad_loc; - prepend_bucket_marker(bucket, loc.key.name, bad_loc); + prepend_bucket_marker(bucket->get_key(), loc.key.name, bad_loc); /* create a new ioctx with the bad locator */ librados::IoCtx src_ioctx; @@ -2912,10 +2877,11 @@ int RGWRados::swift_versioning_copy(RGWObjectCtx& obj_ctx, return 0; } - obj->set_atomic(&obj_ctx); + obj->set_atomic(); RGWObjState * state = nullptr; - int r = get_obj_state(dpp, &obj_ctx, bucket->get_info(), obj->get_obj(), &state, false, y); + RGWObjManifest *manifest = nullptr; + int r = get_obj_state(dpp, &obj_ctx, bucket->get_info(), obj, &state, &manifest, false, y); if (r < 0) { return r; } @@ -2952,7 +2918,7 @@ int RGWRados::swift_versioning_copy(RGWObjectCtx& obj_ctx, dest_obj.gen_rand_obj_instance_name(); } - dest_obj.set_atomic(&obj_ctx); + dest_obj.set_atomic(); rgw_zone_id no_zone; @@ -3048,8 +3014,8 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, obj->gen_rand_obj_instance_name(); } - archive_obj.set_atomic(&obj_ctx); - obj->set_atomic(&obj_ctx); + archive_obj.set_atomic(); + obj->set_atomic(); int ret = copy_obj(obj_ctx, user, @@ -3091,7 +3057,7 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, } /* Need to remove the archived copy. */ - ret = delete_obj(dpp, obj_ctx, archive_binfo, archive_obj.get_obj(), + ret = delete_obj(dpp, archive_binfo, &archive_obj, archive_binfo.versioning_status()); return ret; @@ -3127,11 +3093,12 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, #endif RGWObjState *state; - int r = target->get_state(dpp, &state, false, y, assume_noent); + RGWObjManifest *manifest = nullptr; + int r = target->get_state(dpp, &state, &manifest, false, y, assume_noent); if (r < 0) return r; - rgw_obj& obj = target->get_obj(); + rgw_obj obj = target->get_obj(); if (obj.get_oid().empty()) { ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): cannot write object with empty name" << dendl; @@ -3159,11 +3126,11 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, meta.set_mtime = real_clock::now(); } - if (target->bucket_info.obj_lock_enabled() && target->bucket_info.obj_lock.has_rule() && meta.flags == PUT_OBJ_CREATE) { + if (target->get_bucket_info().obj_lock_enabled() && target->get_bucket_info().obj_lock.has_rule() && meta.flags == PUT_OBJ_CREATE) { auto iter = attrs.find(RGW_ATTR_OBJECT_RETENTION); if (iter == attrs.end()) { - real_time lock_until_date = target->bucket_info.obj_lock.get_lock_until_date(meta.set_mtime); - string mode = target->bucket_info.obj_lock.get_mode(); + real_time lock_until_date = target->get_bucket_info().obj_lock.get_lock_until_date(meta.set_mtime); + string mode = target->get_bucket_info().obj_lock.get_mode(); RGWObjectRetention obj_retention(mode, lock_until_date); bufferlist bl; obj_retention.encode(bl); @@ -3321,7 +3288,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, state = NULL; if (versioned_op && meta.olh_epoch) { - r = store->set_olh(dpp, target->get_ctx(), target->get_bucket_info(), obj, false, NULL, *meta.olh_epoch, real_time(), false, y, meta.zones_trace); + r = store->set_olh(dpp, target->get_ctx(), target->get_bucket_info(), target->get_target(), false, NULL, *meta.olh_epoch, real_time(), false, y, meta.zones_trace); if (r < 0) { return r; } @@ -3659,7 +3626,7 @@ int RGWRados::rewrite_obj(rgw::sal::Object* obj, const DoutPrefixProvider *dpp, rgw::sal::Attrs attrset; uint64_t obj_size; ceph::real_time mtime; - RGWRados::Object op_target(this, obj->get_bucket()->get_info(), rctx, obj->get_obj()); + RGWRados::Object op_target(this, obj->get_bucket(), rctx, obj); RGWRados::Object::Read read_op(&op_target); read_op.params.attrs = &attrset; @@ -4032,6 +3999,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, uint64_t expected_size = 0; RGWObjState *dest_state = NULL; + RGWObjManifest *manifest = nullptr; const real_time *pmod = mod_ptr; @@ -4039,7 +4007,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, if (copy_if_newer) { /* need to get mtime for destination */ - ret = get_obj_state(dpp, &obj_ctx, dest_bucket->get_info(), dest_obj->get_obj(), &dest_state, false, null_yield); + ret = get_obj_state(dpp, &obj_ctx, dest_bucket->get_info(), dest_obj, &dest_state, &manifest, false, null_yield); if (ret < 0) goto set_err_state; @@ -4206,7 +4174,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, if (copy_if_newer && canceled) { ldpp_dout(dpp, 20) << "raced with another write of obj: " << dest_obj << dendl; obj_ctx.invalidate(dest_obj->get_obj()); /* object was overwritten */ - ret = get_obj_state(dpp, &obj_ctx, dest_bucket->get_info(), dest_obj->get_obj(), &dest_state, false, null_yield); + ret = get_obj_state(dpp, &obj_ctx, dest_bucket->get_info(), dest_obj, &dest_state, &manifest, false, null_yield); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": get_err_state() returned ret=" << ret << dendl; goto set_err_state; @@ -4240,7 +4208,7 @@ set_err_state: // for OP_LINK_OLH to call set_olh() with a real olh_epoch if (olh_epoch && *olh_epoch > 0) { constexpr bool log_data_change = true; - ret = set_olh(dpp, obj_ctx, dest_bucket->get_info(), dest_obj->get_obj(), false, nullptr, + ret = set_olh(dpp, obj_ctx, dest_bucket->get_info(), dest_obj, false, nullptr, *olh_epoch, real_time(), false, null_yield, zones_trace, log_data_change); } else { // we already have the latest copy @@ -4370,7 +4338,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, } map src_attrs; - RGWRados::Object src_op_target(this, src_bucket->get_info(), obj_ctx, src_obj->get_obj()); + RGWRados::Object src_op_target(this, src_bucket, obj_ctx, src_obj); RGWRados::Object::Read read_op(&src_op_target); read_op.conds.mod_ptr = mod_ptr; @@ -4418,8 +4386,9 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, RGWObjManifest manifest; RGWObjState *astate = NULL; + RGWObjManifest *amanifest = nullptr; - ret = get_obj_state(dpp, &obj_ctx, src_bucket->get_info(), src_obj->get_obj(), &astate, y); + ret = get_obj_state(dpp, &obj_ctx, src_bucket->get_info(), src_obj, &astate, &amanifest, y); if (ret < 0) { return ret; } @@ -4443,8 +4412,8 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, const rgw_placement_rule *src_rule{nullptr}; - if (astate->manifest) { - src_rule = &astate->manifest->get_tail_placement().placement_rule; + if (amanifest) { + src_rule = &amanifest->get_tail_placement().placement_rule; ldpp_dout(dpp, 20) << __func__ << "(): manifest src_rule=" << src_rule->to_str() << dendl; } @@ -4465,16 +4434,16 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, ldpp_dout(dpp, 20) << __func__ << "(): src_rule=" << src_rule->to_str() << " src_pool=" << src_pool << " dest_rule=" << dest_placement.to_str() << " dest_pool=" << dest_pool << dendl; - bool copy_data = (!astate->manifest) || + bool copy_data = (!amanifest) || (*src_rule != dest_placement) || (src_pool != dest_pool); bool copy_first = false; - if (astate->manifest) { - if (!astate->manifest->has_tail()) { + if (amanifest) { + if (!amanifest->has_tail()) { copy_data = true; } else { - uint64_t head_size = astate->manifest->get_head_size(); + uint64_t head_size = amanifest->get_head_size(); if (head_size > 0) { if (head_size > max_chunk_size) { @@ -4499,7 +4468,8 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, mtime, real_time(), attrs, olh_epoch, delete_at, petag, dpp, y); } - RGWObjManifest::obj_iterator miter = astate->manifest->obj_begin(dpp); + /* This has been in for 2 years, so we can safely assume amanifest is not NULL */ + RGWObjManifest::obj_iterator miter = amanifest->obj_begin(dpp); if (copy_first) { // we need to copy first chunk, not increase refcount ++miter; @@ -4517,7 +4487,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, RGWObjManifest *pmanifest; ldpp_dout(dpp, 20) << "dest_obj=" << dest_obj << " src_obj=" << src_obj << " copy_itself=" << (int)copy_itself << dendl; - RGWRados::Object dest_op_target(this, dest_bucket->get_info(), obj_ctx, dest_obj->get_obj()); + RGWRados::Object dest_op_target(this, dest_bucket, obj_ctx, dest_obj); RGWRados::Object::Write write_op(&dest_op_target); string tag; @@ -4532,13 +4502,13 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, if (!copy_itself) { attrs.erase(RGW_ATTR_TAIL_TAG); - manifest = *astate->manifest; + manifest = *amanifest; const rgw_bucket_placement& tail_placement = manifest.get_tail_placement(); if (tail_placement.bucket.name.empty()) { manifest.set_tail_placement(tail_placement.placement_rule, src_obj->get_bucket()->get_key()); } string ref_tag; - for (; miter != astate->manifest->obj_end(dpp); ++miter) { + for (; miter != amanifest->obj_end(dpp); ++miter) { ObjectWriteOperation op; ref_tag = tag + '\0'; cls_refcount_get(op, ref_tag, true); @@ -4557,7 +4527,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, pmanifest = &manifest; } else { - pmanifest = &(*astate->manifest); + pmanifest = amanifest; /* don't send the object's tail for garbage collection */ astate->keep_tail = true; } @@ -4707,8 +4677,8 @@ int RGWRados::transition_obj(RGWObjectCtx& obj_ctx, real_time read_mtime; uint64_t obj_size; - obj.set_atomic(&obj_ctx); - RGWRados::Object op_target(this, bucket->get_info(), obj_ctx, obj.get_obj()); + obj.set_atomic(); + RGWRados::Object op_target(this, bucket, obj_ctx, &obj); RGWRados::Object::Read read_op(&op_target); read_op.params.attrs = &attrs; @@ -4941,11 +4911,11 @@ int RGWRados::bucket_suspended(const DoutPrefixProvider *dpp, rgw_bucket& bucket int RGWRados::Object::complete_atomic_modification(const DoutPrefixProvider *dpp) { - if ((!state->manifest)|| state->keep_tail) + if ((!manifest)|| state->keep_tail) return 0; cls_rgw_obj_chain chain; - store->update_gc_chain(dpp, obj, *state->manifest, &chain); + store->update_gc_chain(dpp, obj->get_obj(), *manifest, &chain); if (chain.empty()) { return 0; @@ -4966,7 +4936,7 @@ int RGWRados::Object::complete_atomic_modification(const DoutPrefixProvider *dpp return 0; } -void RGWRados::update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj& head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain) +void RGWRados::update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain) { RGWObjManifest::obj_iterator iter; rgw_raw_obj raw_head; @@ -5097,17 +5067,18 @@ int RGWRados::bucket_set_reshard(const DoutPrefixProvider *dpp, const RGWBucketI return CLSRGWIssueSetBucketResharding(index_pool.ioctx(), bucket_objs, entry, cct->_conf->rgw_bucket_index_max_aio)(); } -int RGWRados::defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y) +int RGWRados::defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, optional_yield y) { RGWObjectCtx *rctx = static_cast(ctx); std::string oid, key; - get_obj_bucket_and_oid_loc(obj, oid, key); + get_obj_bucket_and_oid_loc(obj->get_obj(), oid, key); if (!rctx) return 0; RGWObjState *state = NULL; + RGWObjManifest *manifest = nullptr; - int r = get_obj_state(dpp, rctx, bucket_info, obj, &state, false, y); + int r = get_obj_state(dpp, rctx, bucket_info, obj, &state, &manifest, false, y); if (r < 0) return r; @@ -5130,7 +5101,7 @@ int RGWRados::defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucket ldpp_dout(dpp, 0) << "defer chain tag=" << tag << dendl; cls_rgw_obj_chain chain; - update_gc_chain(dpp, state->obj, *state->manifest, &chain); + update_gc_chain(dpp, state->obj, *manifest, &chain); return gc->async_defer_chain(tag, chain); } @@ -5171,9 +5142,8 @@ struct tombstone_entry { int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvider *dpp) { RGWRados *store = target->get_store(); - rgw_obj& src_obj = target->get_obj(); - const string& instance = src_obj.key.instance; - rgw_obj obj = src_obj; + const string& instance = target->get_instance(); + rgw_obj obj = target->get_obj(); if (instance == "null") { obj.key.instance.clear(); @@ -5183,17 +5153,18 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi if (params.versioning_status & BUCKET_VERSIONED || explicit_marker_version) { if (instance.empty() || explicit_marker_version) { - rgw_obj marker = obj; + std::unique_ptr marker = target->get_target()->clone(); + marker->clear_instance(); if (!params.marker_version_id.empty()) { if (params.marker_version_id != "null") { - marker.key.set_instance(params.marker_version_id); + marker->set_instance(params.marker_version_id); } } else if ((params.versioning_status & BUCKET_VERSIONS_SUSPENDED) == 0) { - store->gen_rand_obj_instance_name(&marker); + marker->gen_rand_obj_instance_name(); } - result.version_id = marker.key.instance; + result.version_id = marker->get_instance(); if (result.version_id.empty()) result.version_id = "null"; result.delete_marker = true; @@ -5209,7 +5180,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi meta.mtime = params.mtime; } - int r = store->set_olh(dpp, target->get_ctx(), target->get_bucket_info(), marker, true, &meta, params.olh_epoch, params.unmod_since, params.high_precision_time, y, params.zones_trace); + int r = store->set_olh(dpp, target->get_ctx(), target->get_bucket_info(), marker.get(), true, &meta, params.olh_epoch, params.unmod_since, params.high_precision_time, y, params.zones_trace); if (r < 0) { return r; } @@ -5221,7 +5192,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi return r; } result.delete_marker = dirent.is_delete_marker(); - r = store->unlink_obj_instance(dpp, target->get_ctx(), target->get_bucket_info(), obj, params.olh_epoch, y, params.zones_trace); + r = store->unlink_obj_instance(dpp, target->get_bucket_info(), target->get_target(), params.olh_epoch, y, params.zones_trace); if (r < 0) { return r; } @@ -5235,7 +5206,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi return r; } - r = store->svc.datalog_rados->add_entry(dpp, target->bucket_info, bs->shard_id); + r = store->svc.datalog_rados->add_entry(dpp, target->get_bucket_info(), bs->shard_id); if (r < 0) { ldpp_dout(dpp, -1) << "ERROR: failed writing data log" << dendl; return r; @@ -5251,7 +5222,8 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi } RGWObjState *state; - r = target->get_state(dpp, &state, false, y); + RGWObjManifest *manifest = nullptr; + r = target->get_state(dpp, &state, &manifest, false, y); if (r < 0) return r; @@ -5363,8 +5335,8 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi return 0; } -int RGWRados::delete_obj(const DoutPrefixProvider *dpp, - RGWObjectCtx& obj_ctx, +int RGWRados::delete_obj(rgw::sal::Store* store, + const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, int versioning_status, // versioning flags defined in enum RGWBucketFlags @@ -5372,16 +5344,31 @@ int RGWRados::delete_obj(const DoutPrefixProvider *dpp, const real_time& expiration_time, rgw_zone_set *zones_trace) { - RGWRados::Object del_target(this, bucket_info, obj_ctx, obj); - RGWRados::Object::Delete del_op(&del_target); + std::unique_ptr bucket; + store->get_bucket(nullptr, bucket_info, &bucket); + std::unique_ptr object = bucket->get_object(obj.key); - del_op.params.bucket_owner = bucket_info.owner; - del_op.params.versioning_status = versioning_status; - del_op.params.bilog_flags = bilog_flags; - del_op.params.expiration_time = expiration_time; - del_op.params.zones_trace = zones_trace; + return delete_obj(dpp, bucket_info, object.get(), versioning_status, + bilog_flags, expiration_time, zones_trace); +} + +int RGWRados::delete_obj(const DoutPrefixProvider *dpp, + const RGWBucketInfo& bucket_info, + rgw::sal::Object* obj, + int versioning_status, // versioning flags defined in enum RGWBucketFlags + uint16_t bilog_flags, + const real_time& expiration_time, + rgw_zone_set *zones_trace) +{ + std::unique_ptr del_op = obj->get_delete_op(); - return del_op.delete_obj(null_yield, dpp); + del_op->params.bucket_owner = bucket_info.owner; + del_op->params.versioning_status = versioning_status; + del_op->params.bilog_flags = bilog_flags; + del_op->params.expiration_time = expiration_time; + del_op->params.zones_trace = zones_trace; + + return del_op->delete_obj(dpp, null_yield); } int RGWRados::delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj) @@ -5469,8 +5456,11 @@ static bool has_olh_tag(map& attrs) return (iter != attrs.end()); } -int RGWRados::get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, - RGWObjState *olh_state, RGWObjState **target_state, optional_yield y) +int RGWRados::get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& + obj_ctx, const RGWBucketInfo& bucket_info, + rgw::sal::Object* obj, RGWObjState *olh_state, + RGWObjState **target_state, + RGWObjManifest **target_manifest, optional_yield y) { ceph_assert(olh_state->is_olh); @@ -5479,7 +5469,13 @@ int RGWRados::get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& if (r < 0) { return r; } - r = get_obj_state(dpp, &obj_ctx, bucket_info, target, target_state, false, y); + + std::unique_ptr bucket; + store->get_bucket(nullptr, bucket_info, &bucket); + std::unique_ptr target_obj = bucket->get_object(target.key); + + r = get_obj_state(dpp, &obj_ctx, bucket_info, target_obj.get(), target_state, + target_manifest, false, y); if (r < 0) { return r; } @@ -5487,29 +5483,36 @@ int RGWRados::get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& return 0; } -int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, - RGWObjState **state, bool follow_olh, optional_yield y, bool assume_noent) +int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, + const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, + RGWObjState **state, RGWObjManifest** manifest, + bool follow_olh, optional_yield y, bool assume_noent) { - if (obj.empty()) { + if (obj->empty()) { return -EINVAL; } - bool need_follow_olh = follow_olh && obj.key.instance.empty(); + bool need_follow_olh = follow_olh && obj->get_obj().key.instance.empty(); + *manifest = nullptr; - RGWObjState *s = rctx->get_state(obj); + RGWObjStateManifest *sm = rctx->get_state(obj->get_obj()); + RGWObjState *s = &(sm->state); ldpp_dout(dpp, 20) << "get_obj_state: rctx=" << (void *)rctx << " obj=" << obj << " state=" << (void *)s << " s->prefetch_data=" << s->prefetch_data << dendl; *state = s; + if (sm->manifest) { + *manifest = &(*sm->manifest); + } if (s->has_attrs) { if (s->is_olh && need_follow_olh) { - return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, y); + return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, manifest, y); } return 0; } - s->obj = obj; + s->obj = obj->get_obj(); rgw_raw_obj raw_obj; - obj_to_raw(bucket_info.placement_rule, obj, &raw_obj); + obj_to_raw(bucket_info.placement_rule, obj->get_obj(), &raw_obj); int r = -ENOENT; @@ -5521,7 +5524,7 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc s->exists = false; s->has_attrs = true; tombstone_entry entry; - if (obj_tombstone_cache && obj_tombstone_cache->find(obj, entry)) { + if (obj_tombstone_cache && obj_tombstone_cache->find(obj->get_obj(), entry)) { s->mtime = entry.mtime; s->zone_short_id = entry.zone_short_id; s->pg_ver = entry.pg_ver; @@ -5582,22 +5585,23 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc if (manifest_bl.length()) { auto miter = manifest_bl.cbegin(); try { - s->manifest.emplace(); - decode(*s->manifest, miter); - s->manifest->set_head(bucket_info.placement_rule, obj, s->size); /* patch manifest to reflect the head we just read, some manifests might be + sm->manifest.emplace(); + decode(*sm->manifest, miter); + sm->manifest->set_head(bucket_info.placement_rule, obj->get_obj(), s->size); /* patch manifest to reflect the head we just read, some manifests might be broken due to old bugs */ - s->size = s->manifest->get_obj_size(); + s->size = sm->manifest->get_obj_size(); if (!compressed) s->accounted_size = s->size; } catch (buffer::error& err) { ldpp_dout(dpp, 0) << "ERROR: couldn't decode manifest" << dendl; return -EIO; } - ldpp_dout(dpp, 10) << "manifest: total_size = " << s->manifest->get_obj_size() << dendl; + *manifest = &(*sm->manifest); + ldpp_dout(dpp, 10) << "manifest: total_size = " << sm->manifest->get_obj_size() << dendl; if (cct->_conf->subsys.should_gather() && \ - s->manifest->has_explicit_objs()) { + sm->manifest->has_explicit_objs()) { RGWObjManifest::obj_iterator mi; - for (mi = s->manifest->obj_begin(dpp); mi != s->manifest->obj_end(dpp); ++mi) { + for (mi = sm->manifest->obj_begin(dpp); mi != sm->manifest->obj_end(dpp); ++mi) { ldpp_dout(dpp, 20) << "manifest: ofs=" << mi.get_ofs() << " loc=" << mi.get_location().get_raw_obj(store) << dendl; } } @@ -5607,7 +5611,7 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc * Uh oh, something's wrong, object with manifest should have tag. Let's * create one out of the manifest, would be unique */ - generate_fake_tag(dpp, store, s->attrset, *s->manifest, manifest_bl, s->obj_tag); + generate_fake_tag(dpp, store, s->attrset, *sm->manifest, manifest_bl, s->obj_tag); s->fake_tag = true; } } @@ -5655,8 +5659,8 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc ldpp_dout(dpp, 20) << __func__ << ": setting s->olh_tag to " << string(s->olh_tag.c_str(), s->olh_tag.length()) << dendl; if (need_follow_olh) { - return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, y); - } else if (obj.key.have_null_instance() && !s->manifest) { + return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, manifest, y); + } else if (obj->get_obj().key.have_null_instance() && !sm->manifest) { // read null version, and the head object only have olh info s->exists = false; return -ENOENT; @@ -5666,13 +5670,13 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc return 0; } -int RGWRados::get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, +int RGWRados::get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, RGWObjState **state, RGWObjManifest** manifest, bool follow_olh, optional_yield y, bool assume_noent) { int ret; do { - ret = get_obj_state_impl(dpp, rctx, bucket_info, obj, state, follow_olh, y, assume_noent); + ret = get_obj_state_impl(dpp, rctx, bucket_info, obj, state, manifest, follow_olh, y, assume_noent); } while (ret == -EAGAIN); return ret; @@ -5681,20 +5685,19 @@ int RGWRados::get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, c int RGWRados::Object::get_manifest(const DoutPrefixProvider *dpp, RGWObjManifest **pmanifest, optional_yield y) { RGWObjState *astate; - int r = get_state(dpp, &astate, true, y); + int r = get_state(dpp, &astate, pmanifest, true, y); if (r < 0) { return r; } - *pmanifest = &(*astate->manifest); - return 0; } int RGWRados::Object::Read::get_attr(const DoutPrefixProvider *dpp, const char *name, bufferlist& dest, optional_yield y) { RGWObjState *state; - int r = source->get_state(dpp, &state, true, y); + RGWObjManifest *manifest = nullptr; + int r = source->get_state(dpp, &state, &manifest, true, y); if (r < 0) return r; if (!state->exists) @@ -5707,18 +5710,17 @@ int RGWRados::Object::Read::get_attr(const DoutPrefixProvider *dpp, const char * int RGWRados::Object::Stat::stat_async(const DoutPrefixProvider *dpp) { - RGWObjectCtx& ctx = source->get_ctx(); - rgw_obj& obj = source->get_obj(); + rgw::sal::Object* target = source->get_target(); + rgw_obj obj = target->get_obj(); RGWRados *store = source->get_store(); - RGWObjState *s = ctx.get_state(obj); /* calling this one directly because otherwise a sync request will be sent */ result.obj = obj; - if (s->has_attrs) { + if (target->has_attrs()) { state.ret = 0; - result.size = s->size; - result.mtime = ceph::real_clock::to_timespec(s->mtime); - result.attrs = s->attrset; - result.manifest = s->manifest; + result.size = target->get_obj_size(); + result.mtime = ceph::real_clock::to_timespec(target->get_mtime()); + result.attrs = target->get_attrs(); + //result.manifest = sm->manifest; return 0; } @@ -5783,14 +5785,12 @@ int RGWRados::Object::Stat::finish(const DoutPrefixProvider *dpp) return 0; } -int RGWRados::append_atomic_test(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, - const RGWBucketInfo& bucket_info, const rgw_obj& obj, - ObjectOperation& op, RGWObjState **pstate, optional_yield y) +int RGWRados::append_atomic_test(const DoutPrefixProvider *dpp, + const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, + ObjectOperation& op, RGWObjState **pstate, + RGWObjManifest** pmanifest, optional_yield y) { - if (!rctx) - return 0; - - int r = get_obj_state(dpp, rctx, bucket_info, obj, pstate, false, y); + int r = obj->get_obj_state(dpp, pstate, y, false); if (r < 0) return r; @@ -5814,14 +5814,20 @@ int RGWRados::append_atomic_test(const DoutPrefixProvider *dpp, return 0; } -int RGWRados::Object::get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, bool follow_olh, optional_yield y, bool assume_noent) +int RGWRados::Object::get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, RGWObjManifest **pmanifest, bool follow_olh, optional_yield y, bool assume_noent) { - return store->get_obj_state(dpp, &ctx, bucket_info, obj, pstate, follow_olh, y, assume_noent); + int r = obj->get_obj_state(dpp, pstate, y, follow_olh); + if (r < 0) { + return r; + } + *pmanifest = static_cast(obj)->get_manifest(); + + return r; } void RGWRados::Object::invalidate_state() { - ctx.invalidate(obj); + obj->invalidate(); } int RGWRados::Object::prepare_atomic_modification(const DoutPrefixProvider *dpp, @@ -5829,11 +5835,11 @@ int RGWRados::Object::prepare_atomic_modification(const DoutPrefixProvider *dpp, const char *if_match, const char *if_nomatch, bool removal_op, bool modify_tail, optional_yield y) { - int r = get_state(dpp, &state, false, y); + int r = get_state(dpp, &state, &manifest, false, y); if (r < 0) return r; - bool need_guard = ((state->manifest) || (state->obj_tag.length() != 0) || + bool need_guard = ((manifest) || (state->obj_tag.length() != 0) || if_match != NULL || if_nomatch != NULL) && (!state->fake_tag); @@ -5926,39 +5932,39 @@ int RGWRados::Object::prepare_atomic_modification(const DoutPrefixProvider *dpp, * bl: the contents of the attr * Returns: 0 on success, -ERR# otherwise. */ -int RGWRados::set_attr(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj, const char *name, bufferlist& bl) +int RGWRados::set_attr(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, const char *name, bufferlist& bl) { map attrs; attrs[name] = bl; return set_attrs(dpp, ctx, bucket_info, obj, attrs, NULL, null_yield); } -int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& src_obj, +int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* src_obj, map& attrs, map* rmattrs, optional_yield y) { - rgw_obj obj = src_obj; - if (obj.key.instance == "null") { - obj.key.instance.clear(); + std::unique_ptr obj = src_obj->clone(); + if (obj->get_instance() == "null") { + obj->clear_instance(); } rgw_rados_ref ref; - int r = get_obj_head_ref(dpp, bucket_info, obj, &ref); + int r = get_obj_head_ref(dpp, bucket_info, obj->get_obj(), &ref); if (r < 0) { return r; } - RGWObjectCtx *rctx = static_cast(ctx); ObjectWriteOperation op; RGWObjState *state = NULL; + RGWObjManifest *manifest = nullptr; - r = append_atomic_test(dpp, rctx, bucket_info, obj, op, &state, y); + r = append_atomic_test(dpp, bucket_info, obj.get(), op, &state, &manifest, y); if (r < 0) return r; // ensure null version object exist - if (src_obj.key.instance == "null" && !state->manifest) { + if (src_obj->get_instance() == "null" && !manifest) { return -ENOENT; } @@ -5970,7 +5976,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucke } } - const rgw_bucket& bucket = obj.bucket; + const rgw_bucket& bucket = obj->get_bucket()->get_key(); for (iter = attrs.begin(); iter != attrs.end(); ++iter) { const string& name = iter->first; @@ -5987,7 +5993,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucke decode(ts, bl); rgw_obj_index_key obj_key; - obj.key.get_index_key(&obj_key); + obj->get_key().get_index_key(&obj_key); obj_expirer->hint_add(dpp, ts, bucket.tenant, bucket.name, bucket.bucket_id, obj_key); } catch (buffer::error& err) { @@ -5999,11 +6005,9 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucke if (!op.size()) return 0; - RGWObjectCtx obj_ctx(this->store); - bufferlist bl; RGWRados::Bucket bop(this, bucket_info); - RGWRados::Bucket::UpdateIndex index_op(&bop, obj); + RGWRados::Bucket::UpdateIndex index_op(&bop, obj->get_obj()); if (state) { string tag; @@ -6082,7 +6086,8 @@ int RGWRados::Object::Read::prepare(optional_yield y, const DoutPrefixProvider * map::iterator iter; RGWObjState *astate; - int r = source->get_state(dpp, &astate, true, y); + RGWObjManifest *manifest = nullptr; + int r = source->get_state(dpp, &astate, &manifest, true, y); if (r < 0) return r; @@ -6389,7 +6394,8 @@ int RGWRados::Object::Read::read(int64_t ofs, int64_t end, bufferlist& bl, optio uint64_t max_chunk_size; RGWObjState *astate; - int r = source->get_state(dpp, &astate, true, y); + RGWObjManifest *manifest = nullptr; + int r = source->get_state(dpp, &astate, &manifest, true, y); if (r < 0) return r; @@ -6404,9 +6410,9 @@ int RGWRados::Object::Read::read(int64_t ofs, int64_t end, bufferlist& bl, optio else len = end - ofs + 1; - if (astate->manifest && astate->manifest->has_tail()) { + if (manifest && manifest->has_tail()) { /* now get the relevant object part */ - RGWObjManifest::obj_iterator iter = astate->manifest->obj_find(dpp, ofs); + RGWObjManifest::obj_iterator iter = manifest->obj_find(dpp, ofs); uint64_t stripe_ofs = iter.get_stripe_ofs(); read_obj = iter.get_location().get_raw_obj(store->store); @@ -6431,7 +6437,8 @@ int RGWRados::Object::Read::read(int64_t ofs, int64_t end, bufferlist& bl, optio if (reading_from_head) { /* only when reading from the head object do we need to do the atomic test */ - r = store->append_atomic_test(dpp, &source->get_ctx(), source->get_bucket_info(), state.obj, op, &astate, y); + std::unique_ptr obj = source->bucket->get_object(state.obj.key); + r = store->append_atomic_test(dpp, source->get_bucket_info(), obj.get(), op, &astate, &manifest, y); if (r < 0) return r; @@ -6590,14 +6597,14 @@ int RGWRados::Object::Read::iterate(const DoutPrefixProvider *dpp, int64_t ofs, { RGWRados *store = source->get_store(); CephContext *cct = store->ctx(); - RGWObjectCtx& obj_ctx = source->get_ctx(); const uint64_t chunk_size = cct->_conf->rgw_get_obj_max_req_size; const uint64_t window_size = cct->_conf->rgw_get_obj_window_size; auto aio = rgw::make_throttle(window_size, y); get_obj_data data(store, cb, &*aio, ofs, y); - int r = store->iterate_obj(dpp, obj_ctx, source->get_bucket_info(), state.obj, + int r = store->iterate_obj(dpp, source->get_ctx(), source->get_bucket_info(), + source->get_target(), ofs, end, chunk_size, _get_obj_iterate_cb, &data, y); if (r < 0) { ldpp_dout(dpp, 0) << "iterate_obj() failed with " << r << dendl; @@ -6609,7 +6616,7 @@ int RGWRados::Object::Read::iterate(const DoutPrefixProvider *dpp, int64_t ofs, } int RGWRados::iterate_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, - const RGWBucketInfo& bucket_info, const rgw_obj& obj, + const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, off_t ofs, off_t end, uint64_t max_chunk_size, iterate_obj_cb cb, void *arg, optional_yield y) { @@ -6619,10 +6626,11 @@ int RGWRados::iterate_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, uint64_t len; bool reading_from_head = true; RGWObjState *astate = NULL; + RGWObjManifest *manifest = nullptr; - obj_to_raw(bucket_info.placement_rule, obj, &head_obj); + obj_to_raw(bucket_info.placement_rule, obj->get_obj(), &head_obj); - int r = get_obj_state(dpp, &obj_ctx, bucket_info, obj, &astate, false, y); + int r = get_obj_state(dpp, &obj_ctx, bucket_info, obj, &astate, &manifest, false, y); if (r < 0) { return r; } @@ -6632,11 +6640,11 @@ int RGWRados::iterate_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, else len = end - ofs + 1; - if (astate->manifest) { + if (manifest) { /* now get the relevant object stripe */ - RGWObjManifest::obj_iterator iter = astate->manifest->obj_find(dpp, ofs); + RGWObjManifest::obj_iterator iter = manifest->obj_find(dpp, ofs); - RGWObjManifest::obj_iterator obj_end = astate->manifest->obj_end(dpp); + RGWObjManifest::obj_iterator obj_end = manifest->obj_end(dpp); for (; iter != obj_end && ofs <= end; ++iter) { off_t stripe_ofs = iter.get_stripe_ofs(); @@ -7227,10 +7235,9 @@ static int decode_olh_info(const DoutPrefixProvider *dpp, CephContext* cct, cons } int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, - RGWObjectCtx& obj_ctx, RGWObjState& state, const RGWBucketInfo& bucket_info, - const rgw_obj& obj, + const rgw::sal::Object* obj, bufferlist& olh_tag, std::map >& log, uint64_t *plast_ver, @@ -7325,15 +7332,15 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, } rgw_rados_ref ref; - int r = get_obj_head_ref(dpp, bucket_info, obj, &ref); + int r = get_obj_head_ref(dpp, bucket_info, obj->get_obj(), &ref); if (r < 0) { return r; } - const rgw_bucket& bucket = obj.bucket; + rgw::sal::Bucket* bucket = obj->get_bucket(); if (need_to_link) { - rgw_obj target(bucket, key); + rgw_obj target(bucket->get_key(), key); RGWOLHInfo info; info.target = target; info.removed = delete_marker; @@ -7346,8 +7353,8 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, for (list::iterator liter = remove_instances.begin(); liter != remove_instances.end(); ++liter) { cls_rgw_obj_key& key = *liter; - rgw_obj obj_instance(bucket, key); - int ret = delete_obj(dpp, obj_ctx, bucket_info, obj_instance, 0, RGW_BILOG_FLAG_VERSIONED_OP, ceph::real_time(), zones_trace); + std::unique_ptr obj_instance = bucket->get_object(key); + int ret = delete_obj(dpp, bucket_info, obj_instance.get(), 0, RGW_BILOG_FLAG_VERSIONED_OP, ceph::real_time(), zones_trace); if (ret < 0 && ret != -ENOENT) { ldpp_dout(dpp, 0) << "ERROR: delete_obj() returned " << ret << " obj_instance=" << obj_instance << dendl; return ret; @@ -7364,7 +7371,7 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, return r; } - r = bucket_index_trim_olh_log(dpp, bucket_info, state, obj, last_ver); + r = bucket_index_trim_olh_log(dpp, bucket_info, state, obj->get_obj(), last_ver); if (r < 0) { ldpp_dout(dpp, 0) << "ERROR: could not trim olh log, r=" << r << dendl; return r; @@ -7385,7 +7392,7 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, /* * only clear if was successful, otherwise we might clobber pending operations on this object */ - r = bucket_index_clear_olh(dpp, bucket_info, state, obj); + r = bucket_index_clear_olh(dpp, bucket_info, state, obj->get_obj()); if (r < 0) { ldpp_dout(dpp, 0) << "ERROR: could not clear bucket index olh entries r=" << r << dendl; return r; @@ -7399,18 +7406,18 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, /* * read olh log and apply it */ -int RGWRados::update_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, rgw_zone_set *zones_trace) +int RGWRados::update_olh(const DoutPrefixProvider *dpp, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw::sal::Object* obj, rgw_zone_set *zones_trace) { map > log; bool is_truncated; uint64_t ver_marker = 0; do { - int ret = bucket_index_read_olh_log(dpp, bucket_info, *state, obj, ver_marker, &log, &is_truncated); + int ret = bucket_index_read_olh_log(dpp, bucket_info, *state, obj->get_obj(), ver_marker, &log, &is_truncated); if (ret < 0) { return ret; } - ret = apply_olh_log(dpp, obj_ctx, *state, bucket_info, obj, state->olh_tag, log, &ver_marker, zones_trace); + ret = apply_olh_log(dpp, *state, bucket_info, obj, state->olh_tag, log, &ver_marker, zones_trace); if (ret < 0) { return ret; } @@ -7419,16 +7426,20 @@ int RGWRados::update_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, R return 0; } -int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, const RGWBucketInfo& bucket_info, const rgw_obj& target_obj, bool delete_marker, rgw_bucket_dir_entry_meta *meta, +int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, + const RGWBucketInfo& bucket_info, + rgw::sal::Object* target_obj, bool delete_marker, + rgw_bucket_dir_entry_meta *meta, uint64_t olh_epoch, real_time unmod_since, bool high_precision_time, optional_yield y, rgw_zone_set *zones_trace, bool log_data_change) { string op_tag; - rgw_obj olh_obj = target_obj; - olh_obj.key.instance.clear(); + std::unique_ptr olh_obj = target_obj->clone(); + olh_obj->clear_instance(); RGWObjState *state = NULL; + RGWObjManifest *manifest = nullptr; int ret = 0; int i; @@ -7436,15 +7447,15 @@ int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, cons #define MAX_ECANCELED_RETRY 100 for (i = 0; i < MAX_ECANCELED_RETRY; i++) { if (ret == -ECANCELED) { - obj_ctx.invalidate(olh_obj); + olh_obj->invalidate(); } - ret = get_obj_state(dpp, &obj_ctx, bucket_info, olh_obj, &state, false, y); /* don't follow olh */ + ret = get_obj_state(dpp, &obj_ctx, bucket_info, olh_obj.get(), &state, &manifest, false, y); /* don't follow olh */ if (ret < 0) { return ret; } - ret = olh_init_modification(dpp, bucket_info, *state, olh_obj, &op_tag); + ret = olh_init_modification(dpp, bucket_info, *state, olh_obj->get_obj(), &op_tag); if (ret < 0) { ldpp_dout(dpp, 20) << "olh_init_modification() target_obj=" << target_obj << " delete_marker=" << (int)delete_marker << " returned " << ret << dendl; if (ret == -ECANCELED) { @@ -7452,15 +7463,15 @@ int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, cons } return ret; } - ret = bucket_index_link_olh(dpp, bucket_info, *state, target_obj, delete_marker, - op_tag, meta, olh_epoch, unmod_since, high_precision_time, - zones_trace, log_data_change); + ret = bucket_index_link_olh(dpp, bucket_info, *state, target_obj->get_obj(), + delete_marker, op_tag, meta, olh_epoch, unmod_since, + high_precision_time, zones_trace, log_data_change); if (ret < 0) { ldpp_dout(dpp, 20) << "bucket_index_link_olh() target_obj=" << target_obj << " delete_marker=" << (int)delete_marker << " returned " << ret << dendl; if (ret == -ECANCELED) { // the bucket index rejected the link_olh() due to olh tag mismatch; // attempt to reconstruct olh head attributes based on the bucket index - int r2 = repair_olh(dpp, state, bucket_info, olh_obj); + int r2 = repair_olh(dpp, state, bucket_info, olh_obj->get_obj()); if (r2 < 0 && r2 != -ECANCELED) { return r2; } @@ -7476,7 +7487,7 @@ int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, cons return -EIO; } - ret = update_olh(dpp, obj_ctx, state, bucket_info, olh_obj); + ret = update_olh(dpp, state, bucket_info, olh_obj.get()); if (ret == -ECANCELED) { /* already did what we needed, no need to retry, raced with another user */ ret = 0; } @@ -7488,13 +7499,13 @@ int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, cons return 0; } -int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, +int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, rgw::sal::Object* target_obj, uint64_t olh_epoch, optional_yield y, rgw_zone_set *zones_trace) { string op_tag; - rgw_obj olh_obj = target_obj; - olh_obj.key.instance.clear(); + std::unique_ptr olh_obj = target_obj->clone(); + olh_obj->clear_instance(); RGWObjState *state = NULL; @@ -7503,14 +7514,14 @@ int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& o for (i = 0; i < MAX_ECANCELED_RETRY; i++) { if (ret == -ECANCELED) { - obj_ctx.invalidate(olh_obj); + olh_obj->invalidate(); } - ret = get_obj_state(dpp, &obj_ctx, bucket_info, olh_obj, &state, false, y); /* don't follow olh */ + ret = olh_obj->get_obj_state(dpp, &state, y, false); /* don't follow olh */ if (ret < 0) return ret; - ret = olh_init_modification(dpp, bucket_info, *state, olh_obj, &op_tag); + ret = olh_init_modification(dpp, bucket_info, *state, olh_obj->get_obj(), &op_tag); if (ret < 0) { ldpp_dout(dpp, 20) << "olh_init_modification() target_obj=" << target_obj << " returned " << ret << dendl; if (ret == -ECANCELED) { @@ -7521,7 +7532,7 @@ int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& o string olh_tag(state->olh_tag.c_str(), state->olh_tag.length()); - ret = bucket_index_unlink_instance(dpp, bucket_info, target_obj, op_tag, olh_tag, olh_epoch, zones_trace); + ret = bucket_index_unlink_instance(dpp, bucket_info, target_obj->get_obj(), op_tag, olh_tag, olh_epoch, zones_trace); if (ret < 0) { ldpp_dout(dpp, 20) << "bucket_index_unlink_instance() target_obj=" << target_obj << " returned " << ret << dendl; if (ret == -ECANCELED) { @@ -7537,7 +7548,7 @@ int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& o return -EIO; } - ret = update_olh(dpp, obj_ctx, state, bucket_info, olh_obj, zones_trace); + ret = update_olh(dpp, state, bucket_info, olh_obj.get(), zones_trace); if (ret == -ECANCELED) { /* already did what we needed, no need to retry, raced with another user */ return 0; } @@ -7649,7 +7660,7 @@ int RGWRados::remove_olh_pending_entries(const DoutPrefixProvider *dpp, const RG return 0; } -int RGWRados::follow_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjectCtx& obj_ctx, RGWObjState *state, const rgw_obj& olh_obj, rgw_obj *target) +int RGWRados::follow_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjectCtx& obj_ctx, RGWObjState *state, rgw::sal::Object* olh_obj, rgw_obj *target) { map pending_entries; rgw_filter_attrset(state->attrset, RGW_ATTR_OLH_PENDING_PREFIX, &pending_entries); @@ -7658,16 +7669,16 @@ int RGWRados::follow_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& buc check_pending_olh_entries(dpp,pending_entries, &rm_pending_entries); if (!rm_pending_entries.empty()) { - int ret = remove_olh_pending_entries(dpp, bucket_info, *state, olh_obj, rm_pending_entries); + int ret = remove_olh_pending_entries(dpp, bucket_info, *state, olh_obj->get_obj(), rm_pending_entries); if (ret < 0) { ldpp_dout(dpp, 20) << "ERROR: rm_pending_entries returned ret=" << ret << dendl; return ret; } } if (!pending_entries.empty()) { - ldpp_dout(dpp, 20) << __func__ << "(): found pending entries, need to update_olh() on bucket=" << olh_obj.bucket << dendl; + ldpp_dout(dpp, 20) << __func__ << "(): found pending entries, need to update_olh() on bucket=" << olh_obj->get_bucket() << dendl; - int ret = update_olh(dpp, obj_ctx, state, bucket_info, olh_obj); + int ret = update_olh(dpp, state, bucket_info, olh_obj); if (ret < 0) { return ret; } @@ -9114,15 +9125,16 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp, bufferlist& suggested_updates, optional_yield y) { - const rgw_bucket& bucket = bucket_info.bucket; + std::unique_ptr bucket; + store->get_bucket(nullptr, bucket_info, &bucket); uint8_t suggest_flag = (svc.zone->get_zone().log_data ? CEPH_RGW_DIR_SUGGEST_LOG_OP : 0); std::string loc; - rgw_obj obj(bucket, list_state.key); + std::unique_ptr obj = bucket->get_object(list_state.key); string oid; - get_obj_bucket_and_oid_loc(obj, oid, loc); + get_obj_bucket_and_oid_loc(obj->get_obj(), oid, loc); if (loc != list_state.locator) { ldpp_dout(dpp, 0) << "WARNING: generated locator (" << loc << ") is different from listed locator (" << list_state.locator << ")" << dendl; @@ -9131,8 +9143,9 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp, io_ctx.locator_set_key(list_state.locator); RGWObjState *astate = NULL; + RGWObjManifest *manifest = nullptr; RGWObjectCtx rctx(this->store); - int r = get_obj_state(dpp, &rctx, bucket_info, obj, &astate, false, y); + int r = get_obj_state(dpp, &rctx, bucket_info, obj.get(), &astate, &manifest, false, y); if (r < 0) return r; @@ -9177,13 +9190,12 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp, } } - if (astate->manifest) { + if (manifest) { RGWObjManifest::obj_iterator miter; - RGWObjManifest& manifest = *astate->manifest; - for (miter = manifest.obj_begin(dpp); miter != manifest.obj_end(dpp); ++miter) { + for (miter = manifest->obj_begin(dpp); miter != manifest->obj_end(dpp); ++miter) { const rgw_raw_obj& raw_loc = miter.get_location().get_raw_obj(store); rgw_obj loc; - RGWSI_Tier_RADOS::raw_obj_to_obj(manifest.get_obj().bucket, raw_loc, &loc); + RGWSI_Tier_RADOS::raw_obj_to_obj(manifest->get_obj().bucket, raw_loc, &loc); if (loc.key.ns == RGW_OBJ_NS_MULTIPART) { ldpp_dout(dpp, 0) << "check_disk_state(): removing manifest part from index: " << loc << dendl; @@ -9210,7 +9222,7 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp, list_state.meta.content_type = content_type; librados::IoCtx head_obj_ctx; // initialize to data pool so we can get pool id - int ret = get_obj_head_ioctx(dpp, bucket_info, obj, &head_obj_ctx); + int ret = get_obj_head_ioctx(dpp, bucket_info, obj->get_obj(), &head_obj_ctx); if (ret < 0) { ldpp_dout(dpp, 0) << __PRETTY_FUNCTION__ << " WARNING: unable to find head object data pool for \"" << diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 7ec229fee18d..1fd06d5b55fb 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -184,25 +184,29 @@ public: const rgw_placement_rule **prule) override; }; +struct RGWObjStateManifest { + RGWObjState state; + std::optional manifest; +}; + class RGWObjectCtx { rgw::sal::Store* store; ceph::shared_mutex lock = ceph::make_shared_mutex("RGWObjectCtx"); - void *s{nullptr}; - std::map objs_state; + std::map objs_state; public: explicit RGWObjectCtx(rgw::sal::Store* _store) : store(_store) {} - explicit RGWObjectCtx(rgw::sal::Store* _store, void *_s) : store(_store), s(_s) {} - - void *get_private() { - return s; + RGWObjectCtx(RGWObjectCtx& _o) { + std::unique_lock wl{lock}; + this->store = _o.store; + this->objs_state = _o.objs_state; } rgw::sal::Store* get_store() { return store; } - RGWObjState *get_state(const rgw_obj& obj); + RGWObjStateManifest *get_state(const rgw_obj& obj); void set_compressed(const rgw_obj& obj); void set_atomic(rgw_obj& obj); @@ -402,12 +406,15 @@ class RGWRados int get_system_obj_ref(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, rgw_rados_ref *ref); uint64_t max_bucket_id; - int get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, - RGWObjState *olh_state, RGWObjState **target_state, optional_yield y); - int get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, + int get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& rctx, + const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, + RGWObjState *olh_state, RGWObjState **target_state, + RGWObjManifest **target_manifest, optional_yield y); + int get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, RGWObjState **state, RGWObjManifest** manifest, bool follow_olh, optional_yield y, bool assume_noent = false); - int append_atomic_test(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, - librados::ObjectOperation& op, RGWObjState **state, optional_yield y); + int append_atomic_test(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, + librados::ObjectOperation& op, RGWObjState **state, + RGWObjManifest** pmanifest, optional_yield y); int update_placement_map(); int store_bucket_info(RGWBucketInfo& info, std::map *pattrs, RGWObjVersionTracker *objv_tracker, bool exclusive); @@ -655,13 +662,14 @@ public: class Object { RGWRados *store; - RGWBucketInfo bucket_info; + rgw::sal::Bucket* bucket; RGWObjectCtx& ctx; - rgw_obj obj; + rgw::sal::Object* obj; BucketShard bs; RGWObjState *state; + RGWObjManifest *manifest; bool versioning_disabled; @@ -670,7 +678,7 @@ public: const rgw_placement_rule *pmeta_placement_rule; protected: - int get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, bool follow_olh, optional_yield y, bool assume_noent = false); + int get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, RGWObjManifest **pmanifest, bool follow_olh, optional_yield y, bool assume_noent = false); void invalidate_state(); int prepare_atomic_modification(const DoutPrefixProvider *dpp, librados::ObjectWriteOperation& op, bool reset_obj, const std::string *ptag, @@ -678,22 +686,24 @@ public: int complete_atomic_modification(const DoutPrefixProvider *dpp); public: - Object(RGWRados *_store, const RGWBucketInfo& _bucket_info, RGWObjectCtx& _ctx, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), + Object(RGWRados *_store, rgw::sal::Bucket* _bucket, RGWObjectCtx& _ctx, rgw::sal::Object* _obj) : store(_store), bucket(_bucket), ctx(_ctx), obj(_obj), bs(store), - state(NULL), versioning_disabled(false), + state(NULL), manifest(nullptr), versioning_disabled(false), bs_initialized(false), pmeta_placement_rule(nullptr) {} RGWRados *get_store() { return store; } - rgw_obj& get_obj() { return obj; } + rgw_obj get_obj() { return obj->get_obj(); } RGWObjectCtx& get_ctx() { return ctx; } - RGWBucketInfo& get_bucket_info() { return bucket_info; } + RGWBucketInfo& get_bucket_info() { return bucket->get_info(); } + const std::string& get_instance() { return obj->get_instance(); } + rgw::sal::Object* get_target() { return obj; } int get_manifest(const DoutPrefixProvider *dpp, RGWObjManifest **pmanifest, optional_yield y); int get_bucket_shard(BucketShard **pbs, const DoutPrefixProvider *dpp) { if (!bs_initialized) { int r = - bs.init(bucket_info.bucket, obj, nullptr /* no RGWBucketInfo */, dpp); + bs.init(bucket->get_key(), obj->get_obj(), nullptr /* no RGWBucketInfo */, dpp); if (r < 0) { return r; } @@ -708,7 +718,7 @@ public: } bool versioning_enabled() { - return (!versioning_disabled && bucket_info.versioning_enabled()); + return (!versioning_disabled && bucket->versioning_enabled()); } void set_meta_placement_rule(const rgw_placement_rule *p) { @@ -716,7 +726,7 @@ public: } const rgw_placement_rule& get_meta_placement_rule() { - return pmeta_placement_rule ? *pmeta_placement_rule : bucket_info.placement_rule; + return pmeta_placement_rule ? *pmeta_placement_rule : bucket->get_placement_rule(); } struct Read { @@ -805,7 +815,7 @@ public: std::map& attrs, optional_yield y); int write_data(const char *data, uint64_t ofs, uint64_t len, bool exclusive); const req_state* get_req_state() { - return (req_state *)target->get_ctx().get_private(); + return nullptr; /* XXX dang Only used by LTTng, and it handles null anyway */ } }; @@ -848,7 +858,7 @@ public: struct Result { rgw_obj obj; - std::optional manifest; + std::optional manifest; uint64_t size{0}; struct timespec mtime {}; std::map attrs; @@ -1206,14 +1216,21 @@ public: int bucket_suspended(const DoutPrefixProvider *dpp, rgw_bucket& bucket, bool *suspended); /** Delete an object.*/ - int delete_obj(const DoutPrefixProvider *dpp, - RGWObjectCtx& obj_ctx, + int delete_obj(rgw::sal::Store* store, + const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_owner, const rgw_obj& src_obj, int versioning_status, // versioning flags defined in enum RGWBucketFlags uint16_t bilog_flags = 0, const ceph::real_time& expiration_time = ceph::real_time(), rgw_zone_set *zones_trace = nullptr); + int delete_obj(const DoutPrefixProvider *dpp, + const RGWBucketInfo& bucket_owner, + rgw::sal::Object* src_obj, + int versioning_status, // versioning flags defined in enum RGWBucketFlags + uint16_t bilog_flags = 0, + const ceph::real_time& expiration_time = ceph::real_time(), + rgw_zone_set *zones_trace = nullptr); int delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj); @@ -1228,24 +1245,24 @@ public: * bl: the contents of the attr * Returns: 0 on success, -ERR# otherwise. */ - int set_attr(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj, const char *name, bufferlist& bl); + int set_attr(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, const char *name, bufferlist& bl); - int set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj, + int set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, std::map& attrs, std::map* rmattrs, optional_yield y); - int get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, + int get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, RGWObjState **state, RGWObjManifest** manifest, bool follow_olh, optional_yield y, bool assume_noent = false); - int get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, optional_yield y) { - return get_obj_state(dpp, rctx, bucket_info, obj, state, true, y); + int get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, RGWObjState **state, RGWObjManifest** manifest, optional_yield y) { + return get_obj_state(dpp, rctx, bucket_info, obj, state, manifest, true, y); } using iterate_obj_cb = int (*)(const DoutPrefixProvider*, const rgw_raw_obj&, off_t, off_t, off_t, bool, RGWObjState*, void*); int iterate_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& ctx, const RGWBucketInfo& bucket_info, - const rgw_obj& obj, off_t ofs, off_t end, + rgw::sal::Object* obj, off_t ofs, off_t end, uint64_t max_chunk_size, iterate_obj_cb cb, void *arg, optional_yield y); @@ -1295,21 +1312,21 @@ public: std::map > *log, bool *is_truncated); int bucket_index_trim_olh_log(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjState& obj_state, const rgw_obj& obj_instance, uint64_t ver); int bucket_index_clear_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& obj_instance); - int apply_olh_log(const DoutPrefixProvider *dpp, RGWObjectCtx& ctx, RGWObjState& obj_state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, + int apply_olh_log(const DoutPrefixProvider *dpp, RGWObjState& obj_state, const RGWBucketInfo& bucket_info, const rgw::sal::Object* obj, bufferlist& obj_tag, std::map >& log, uint64_t *plast_ver, rgw_zone_set *zones_trace = nullptr); - int update_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, rgw_zone_set *zones_trace = nullptr); - int set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, const RGWBucketInfo& bucket_info, const rgw_obj& target_obj, bool delete_marker, rgw_bucket_dir_entry_meta *meta, + int update_olh(const DoutPrefixProvider *dpp, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw::sal::Object* obj, rgw_zone_set *zones_trace = nullptr); + int set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* target_obj, bool delete_marker, rgw_bucket_dir_entry_meta *meta, uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, optional_yield y, rgw_zone_set *zones_trace = nullptr, bool log_data_change = false); int repair_olh(const DoutPrefixProvider *dpp, RGWObjState* state, const RGWBucketInfo& bucket_info, const rgw_obj& obj); - int unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, + int unlink_obj_instance(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, rgw::sal::Object* target_obj, uint64_t olh_epoch, optional_yield y, rgw_zone_set *zones_trace = nullptr); void check_pending_olh_entries(const DoutPrefixProvider *dpp, std::map& pending_entries, std::map *rm_pending_entries); int remove_olh_pending_entries(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& olh_obj, std::map& pending_attrs); - int follow_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjectCtx& ctx, RGWObjState *state, const rgw_obj& olh_obj, rgw_obj *target); + int follow_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjectCtx& ctx, RGWObjState *state, rgw::sal::Object* olh_obj, rgw_obj *target); int get_olh(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWOLHInfo *olh); void gen_rand_obj_instance_name(rgw_obj_key *target_key); @@ -1443,7 +1460,7 @@ public: int lock_exclusive(const rgw_pool& pool, const std::string& oid, ceph::timespan& duration, rgw_zone_id& zone_id, std::string& owner_id); int unlock(const rgw_pool& pool, const std::string& oid, rgw_zone_id& zone_id, std::string& owner_id); - void update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj& head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain); + void update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain); int send_chain_to_gc(cls_rgw_obj_chain& chain, const std::string& tag); void delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain, const std::string& tag); int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectWriteOperation *op); @@ -1454,7 +1471,7 @@ public: int list_gc_objs(int *index, std::string& marker, uint32_t max, bool expired_only, std::list& result, bool *truncated, bool& processing_queue); int process_gc(bool expired_only); bool process_expire_objects(const DoutPrefixProvider *dpp); - int defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y); + int defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, rgw::sal::Object* obj, optional_yield y); int process_lc(const std::unique_ptr& optional_bucket); int list_lc_progress(std::string& marker, uint32_t max_entries, diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index f096a81c6708..f2bdfa39b040 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2586,7 +2586,7 @@ int RGWPutObj_ObjStore_S3::get_encrypt_filter( multipart_upload_id); std::unique_ptr obj = upload->get_meta_obj(); obj->set_in_extra_data(true); - res = obj->get_obj_attrs(s->obj_ctx, s->yield, this); + res = obj->get_obj_attrs(s->yield, this); if (res == 0) { std::unique_ptr block_crypt; /* We are adding to existing object. @@ -4024,7 +4024,7 @@ void RGWGetObjLayout_ObjStore_S3::send_response() } f.open_object_section("result"); - s->object->dump_obj_layout(this, s->yield, &f, s->obj_ctx); + s->object->dump_obj_layout(this, s->yield, &f); f.close_section(); rgw_flush_formatter(s, &f); } @@ -4947,12 +4947,11 @@ bool RGWHandler_REST_S3Website::web_dir() const { std::unique_ptr obj = s->bucket->get_object(rgw_obj_key(subdir_name)); - RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); - obj->set_atomic(&obj_ctx); - obj->set_prefetch_data(&obj_ctx); + obj->set_atomic(); + obj->set_prefetch_data(); RGWObjState* state = nullptr; - if (obj->get_obj_state(s, &obj_ctx, &state, s->yield) < 0) { + if (obj->get_obj_state(s, &state, s->yield) < 0) { return false; } if (! state->exists) { diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index f7a6340a41c2..c403ab70006b 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -864,14 +864,13 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) { std::unique_ptr slo_seg = bucket->get_object(rgw_obj_key(obj_name)); /* no prefetch */ - RGWObjectCtx obj_ctx(store); - slo_seg->set_atomic(&obj_ctx); + slo_seg->set_atomic(); bool compressed; RGWCompressionInfo cs_info; uint64_t size_bytes{0}; - r = slo_seg->get_obj_attrs(&obj_ctx, s->yield, s); + r = slo_seg->get_obj_attrs(s->yield, s); if (r < 0) { return r; } @@ -2565,12 +2564,11 @@ bool RGWSwiftWebsiteHandler::is_web_dir() const std::unique_ptr obj = s->bucket->get_object(rgw_obj_key(std::move(subdir_name))); /* First, get attrset of the object we'll try to retrieve. */ - RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); - obj->set_atomic(&obj_ctx); - obj->set_prefetch_data(&obj_ctx); + obj->set_atomic(); + obj->set_prefetch_data(); RGWObjState* state = nullptr; - if (obj->get_obj_state(s, &obj_ctx, &state, s->yield, false)) { + if (obj->get_obj_state(s, &state, s->yield, false)) { return false; } @@ -2595,12 +2593,11 @@ bool RGWSwiftWebsiteHandler::is_index_present(const std::string& index) const { std::unique_ptr obj = s->bucket->get_object(rgw_obj_key(index)); - RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); - obj->set_atomic(&obj_ctx); - obj->set_prefetch_data(&obj_ctx); + obj->set_atomic(); + obj->set_prefetch_data(); RGWObjState* state = nullptr; - if (obj->get_obj_state(s, &obj_ctx, &state, s->yield, false)) { + if (obj->get_obj_state(s, &state, s->yield, false)) { return false; } diff --git a/src/rgw/rgw_sal.cc b/src/rgw/rgw_sal.cc index 418368ba3905..d08fbcc8713a 100644 --- a/src/rgw/rgw_sal.cc +++ b/src/rgw/rgw_sal.cc @@ -46,6 +46,41 @@ extern rgw::sal::Store* newMotrStore(CephContext *cct); #endif } +RGWObjState::RGWObjState() { +} + +RGWObjState::~RGWObjState() { +} + +RGWObjState::RGWObjState(const RGWObjState& rhs) : obj (rhs.obj) { + is_atomic = rhs.is_atomic; + has_attrs = rhs.has_attrs; + exists = rhs.exists; + size = rhs.size; + accounted_size = rhs.accounted_size; + mtime = rhs.mtime; + epoch = rhs.epoch; + if (rhs.obj_tag.length()) { + obj_tag = rhs.obj_tag; + } + if (rhs.tail_tag.length()) { + tail_tag = rhs.tail_tag; + } + write_tag = rhs.write_tag; + fake_tag = rhs.fake_tag; + shadow_obj = rhs.shadow_obj; + has_data = rhs.has_data; + if (rhs.data.length()) { + data = rhs.data; + } + prefetch_data = rhs.prefetch_data; + keep_tail = rhs.keep_tail; + is_olh = rhs.is_olh; + objv_tracker = rhs.objv_tracker; + pg_ver = rhs.pg_ver; + compressed = rhs.compressed; +} + rgw::sal::Store* StoreManager::init_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, bool run_sync_thread, bool run_reshard_thread, bool use_cache, bool use_gc) { if (svc.compare("rados") == 0) { diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 2fc8ab62b9bb..4cab98f298bd 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -20,10 +20,8 @@ #include "common/tracer.h" class RGWGetDataCB; -struct RGWObjState; class RGWAccessListFilter; class RGWLC; -class RGWObjManifest; struct RGWZoneGroup; struct RGWZoneParams; struct RGWRealm; @@ -103,6 +101,50 @@ public: } }; +struct RGWObjState { + rgw_obj obj; + bool is_atomic{false}; + bool has_attrs{false}; + bool exists{false}; + uint64_t size{0}; //< size of raw object + uint64_t accounted_size{0}; //< size before compression, encryption + ceph::real_time mtime; + uint64_t epoch{0}; + bufferlist obj_tag; + bufferlist tail_tag; + std::string write_tag; + bool fake_tag{false}; + std::string shadow_obj; + bool has_data{false}; + bufferlist data; + bool prefetch_data{false}; + bool keep_tail{false}; + bool is_olh{false}; + bufferlist olh_tag; + uint64_t pg_ver{false}; + uint32_t zone_short_id{0}; + bool compressed{false}; + + /* important! don't forget to update copy constructor */ + + RGWObjVersionTracker objv_tracker; + + std::map attrset; + + RGWObjState(); + RGWObjState(const RGWObjState& rhs); + ~RGWObjState(); + + bool get_attr(std::string name, bufferlist& dest) { + auto iter = attrset.find(name); + if (iter != attrset.end()) { + dest = iter->second; + return true; + } + return false; + } +}; + /** * @defgroup RGWSAL RGW Store Abstraction Layer * @@ -292,7 +334,7 @@ class Store { rgw::notify::EventType event_type, const std::string* object_name=nullptr) = 0; /** No-req_state variant (e.g., rgwlc) */ virtual std::unique_ptr get_notification( - const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, RGWObjectCtx* rctx, + const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) = 0; @@ -381,7 +423,7 @@ class Store { virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -390,7 +432,7 @@ class Store { virtual std::unique_ptr get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) = 0; @@ -850,14 +892,10 @@ public: */ class Object { protected: - rgw_obj_key key; - Bucket* bucket; - std::string index_hash_source; - uint64_t obj_size; - Attrs attrs; - ceph::real_time mtime; - bool delete_marker{false}; - bool in_extra_data{false}; + RGWObjState state; /**< The key and primary metadata for the object */ + Bucket* bucket; /**< @a Bucket containing this object */ + Attrs attrs; /**< Cache of attributes for this object */ + bool delete_marker{false}; /**< True if this object has a delete marker */ public: @@ -928,40 +966,33 @@ class Object { }; Object() - : key(), + : state(), bucket(nullptr), - index_hash_source(), - obj_size(), - attrs(), - mtime() {} + attrs() + {} Object(const rgw_obj_key& _k) - : key(_k), + : state(), bucket(), - index_hash_source(), - obj_size(), - attrs(), - mtime() {} + attrs() + { state.obj.key = _k; } Object(const rgw_obj_key& _k, Bucket* _b) - : key(_k), + : state(), bucket(_b), - index_hash_source(), - obj_size(), - attrs(), - mtime() {} + attrs() + { state.obj.init(_b->get_key(), _k); } Object(Object& _o) = default; virtual ~Object() = default; /** Shortcut synchronous delete call for common deletes */ virtual int delete_object(const DoutPrefixProvider* dpp, - RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning = false) = 0; /** Asynchronous delete call */ virtual int delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astate, Completions* aio, bool keep_index_consistent, optional_yield y) = 0; /** Copy an this object to another object. */ - virtual int copy_object(RGWObjectCtx& obj_ctx, User* user, + virtual int copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, rgw::sal::Bucket* dest_bucket, rgw::sal::Bucket* src_bucket, @@ -981,28 +1012,54 @@ class Object { /** 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(RGWObjectCtx* rctx) const = 0; + virtual void set_atomic() { + state.is_atomic = true; + } + /** Check if this object is atomic */ + bool is_atomic() { return state.is_atomic; } /** Pre-fetch data when reading */ - virtual void set_prefetch_data(RGWObjectCtx* rctx) = 0; + virtual void set_prefetch_data() { + state.prefetch_data = true; + } + /** Check if this object should prefetch */ + bool is_prefetch_data() { return state.prefetch_data; } /** Mark data as compressed */ - virtual void set_compressed(RGWObjectCtx* rctx) = 0; + virtual void set_compressed() { + state.compressed = true; + } + /** Check if this object is compressed */ + bool is_compressed() { return state.compressed; } + /** Invalidate cached info about this object, except atomic, prefetch, and + * compressed */ + virtual void invalidate() { + rgw_obj obj = state.obj; + bool is_atomic = state.is_atomic; + bool prefetch_data = state.prefetch_data; + bool compressed = state.compressed; + + state = RGWObjState(); + state.obj = obj; + state.is_atomic = is_atomic; + state.prefetch_data = prefetch_data; + state.compressed = compressed; + } /** Check to see if this object has an empty key. This means it's uninitialized */ - bool empty() const { return key.empty(); } + bool empty() const { return state.obj.empty(); } /** Get the name of this object */ - const std::string &get_name() const { return key.name; } + const std::string &get_name() const { return state.obj.key.name; } /** Get the object state for this object. Will be removed in the future */ - virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh = true) = 0; + virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **state, optional_yield y, bool follow_olh = true) = 0; /** Set attributes for this object from the backing store. Attrs can be set or * deleted. @note the attribute APIs may be revisited in the future. */ - virtual int set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj = NULL) = 0; + virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) = 0; /** Get attributes for this object */ - virtual int get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) = 0; + virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) = 0; /** Modify attributes for this object. */ - virtual int modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) = 0; + virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) = 0; /** Delete attributes for this object */ - virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) = 0; + virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) = 0; /** Check to see if this object has expired */ virtual bool is_expired() = 0; /** Create a randomized instance ID for this object */ @@ -1010,8 +1067,7 @@ class Object { /** Get a multipart serializer for this object */ virtual MPSerializer* get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name) = 0; /** Move the data of an object to new placement storage */ - virtual int transition(RGWObjectCtx& rctx, - Bucket* bucket, + virtual int transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, @@ -1020,63 +1076,58 @@ class Object { /** Check to see if two placement rules match */ virtual bool placement_rules_match(rgw_placement_rule& r1, rgw_placement_rule& r2) = 0; /** Dump store-specific object layout info in JSON */ - virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) = 0; + virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) = 0; /** Get the cached attributes for this object */ - Attrs& get_attrs(void) { return attrs; } + Attrs& get_attrs(void) { return state.attrset; } /** Get the (const) cached attributes for this object */ - const Attrs& get_attrs(void) const { return attrs; } + const Attrs& get_attrs(void) const { return state.attrset; } /** Set the cached attributes for this object */ - virtual int set_attrs(Attrs a) { attrs = a; return 0; } + virtual int set_attrs(Attrs a) { state.attrset = a; state.has_attrs = true; return 0; } + /** Check to see if attributes are cached on this object */ + bool has_attrs(void) { return state.has_attrs; } /** Get the cached modification time for this object */ - ceph::real_time get_mtime(void) const { return mtime; } + ceph::real_time get_mtime(void) const { return state.mtime; } /** Get the cached size for this object */ - uint64_t get_obj_size(void) const { return obj_size; } + uint64_t get_obj_size(void) const { return state.size; } /** Get the bucket containing this object */ Bucket* get_bucket(void) const { return bucket; } /** Set the bucket containing this object */ - void set_bucket(Bucket* b) { bucket = b; } + void set_bucket(Bucket* b) { bucket = b; state.obj.bucket = b->get_key(); } /** Get the sharding hash representation of this object */ - std::string get_hash_source(void) { return index_hash_source; } + std::string get_hash_source(void) { return state.obj.index_hash_source; } /** Set the sharding hash representation of this object */ - void set_hash_source(std::string s) { index_hash_source = s; } + void set_hash_source(std::string s) { state.obj.index_hash_source = s; } /** Build an Object Identifier string for this object */ - std::string get_oid(void) const { return key.get_oid(); } + std::string get_oid(void) const { return state.obj.key.get_oid(); } /** True if this object is a delete marker (newest version is deleted) */ bool get_delete_marker(void) { return delete_marker; } /** True if this object is stored in the extra data pool */ - bool get_in_extra_data(void) { return in_extra_data; } + bool get_in_extra_data(void) { return state.obj.is_in_extra_data(); } /** Set the in_extra_data field */ - void set_in_extra_data(bool i) { in_extra_data = i; } + void set_in_extra_data(bool i) { state.obj.set_in_extra_data(i); } /** Helper to sanitize object size, offset, and end values */ int range_to_ofs(uint64_t obj_size, int64_t &ofs, int64_t &end); /** Set the cached size of this object */ - void set_obj_size(uint64_t s) { obj_size = s; } + void set_obj_size(uint64_t s) { state.size = s; } /** Set the cached name of this object */ - virtual void set_name(const std::string& n) { key = n; } + virtual void set_name(const std::string& n) { state.obj.key = n; } /** Set the cached key of this object */ - virtual void set_key(const rgw_obj_key& k) { key = k; } + virtual void set_key(const rgw_obj_key& k) { state.obj.key = k; } /** Get an rgw_obj representing this object */ - virtual rgw_obj get_obj(void) const { - rgw_obj obj(bucket->get_key(), key); - obj.set_in_extra_data(in_extra_data); - obj.index_hash_source = index_hash_source; - return obj; - } + virtual rgw_obj get_obj(void) const { return state.obj; } /** Restore the previous swift version of this object */ - virtual int swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, /* out */ + virtual int swift_versioning_restore(bool& restored, /* out */ const DoutPrefixProvider* dpp) = 0; /** Copy the current version of a swift object to the configured destination bucket*/ - virtual int swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, + virtual int swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) = 0; /** Get a new ReadOp for this object */ - virtual std::unique_ptr get_read_op(RGWObjectCtx*) = 0; + virtual std::unique_ptr get_read_op() = 0; /** Get a new DeleteOp for this object */ - virtual std::unique_ptr get_delete_op(RGWObjectCtx*) = 0; + virtual std::unique_ptr get_delete_op() = 0; /** Get @a count OMAP values via listing, starting at @a marker for this object */ virtual int omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker, uint64_t count, @@ -1100,18 +1151,20 @@ class Object { /* dang - This is temporary, until the API is completed */ /** Get the key for this object */ - rgw_obj_key& get_key() { return key; } + rgw_obj_key& get_key() { return state.obj.key; } /** Set the instance for this object */ - void set_instance(const std::string &i) { key.set_instance(i); } + void set_instance(const std::string &i) { state.obj.key.set_instance(i); } /** Get the instance for this object */ - const std::string &get_instance() const { return key.instance; } + const std::string &get_instance() const { return state.obj.key.instance; } /** Check to see if this object has an instance set */ - bool have_instance(void) { return key.have_instance(); } + bool have_instance(void) { return state.obj.key.have_instance(); } + /** Clear the instance on this object */ + void clear_instance() { state.obj.key.instance.clear(); } friend inline std::ostream& operator<<(std::ostream& out, const Object& o) { if (o.bucket) out << o.bucket << ":"; - out << o.key; + out << o.state.obj.key; return out; } friend inline std::ostream& operator<<(std::ostream& out, const Object* o) { @@ -1187,15 +1240,14 @@ public: virtual std::unique_ptr get_meta_obj() = 0; /** Initialize this upload */ - virtual int init(const DoutPrefixProvider* dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) = 0; + virtual int init(const DoutPrefixProvider* dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) = 0; /** List all the parts of this upload, filling the parts cache */ virtual int list_parts(const DoutPrefixProvider* dpp, CephContext* cct, int num_parts, int marker, int* next_marker, bool* truncated, bool assume_unsorted = false) = 0; /** Abort this upload */ - virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, - RGWObjectCtx* obj_ctx) = 0; + virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct) = 0; /** Complete this upload, making it available as a normal object */ virtual int complete(const DoutPrefixProvider* dpp, optional_yield y, CephContext* cct, @@ -1205,17 +1257,16 @@ public: RGWCompressionInfo& cs_info, off_t& ofs, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) = 0; + rgw::sal::Object* target_obj) = 0; /** Get placement and/or attribute info for this upload */ - virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) = 0; + virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) = 0; /** Get a Writer to write to a part of this upload */ virtual std::unique_ptr get_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) = 0; diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index bd9009873111..e7415b9907b9 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -565,32 +565,48 @@ namespace rgw::sal { return std::make_unique(this); } - int DBObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh) + int DBObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **pstate, optional_yield y, bool follow_olh) { - *state = &(this->state); + RGWObjState* astate; DB::Object op_target(store->getDB(), get_bucket()->get_info(), get_obj()); - return op_target.get_obj_state(dpp, get_bucket()->get_info(), get_obj(), follow_olh, state); + int ret = op_target.get_obj_state(dpp, get_bucket()->get_info(), get_obj(), follow_olh, &astate); + if (ret < 0) { + return ret; + } + + /* Don't overwrite obj, atomic, or prefetch */ + rgw_obj obj = get_obj(); + bool is_atomic = state.is_atomic; + bool prefetch_data = state.prefetch_data; + + state = *astate; + *pstate = &state; + + state.obj = obj; + state.is_atomic = is_atomic; + state.prefetch_data = prefetch_data; + return ret; } int DBObject::read_attrs(const DoutPrefixProvider* dpp, DB::Object::Read &read_op, optional_yield y, rgw_obj* target_obj) { read_op.params.attrs = &attrs; read_op.params.target_obj = target_obj; - read_op.params.obj_size = &obj_size; - read_op.params.lastmod = &mtime; + read_op.params.obj_size = &state.size; + read_op.params.lastmod = &state.mtime; return read_op.prepare(dpp); } - int DBObject::set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj) + int DBObject::set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) { Attrs empty; DB::Object op_target(store->getDB(), - get_bucket()->get_info(), target_obj ? *target_obj : get_obj()); + get_bucket()->get_info(), get_obj()); return op_target.set_attrs(dpp, setattrs ? *setattrs : empty, delattrs); } - int DBObject::get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) + int DBObject::get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) { DB::Object op_target(store->getDB(), get_bucket()->get_info(), get_obj()); DB::Object::Read read_op(&op_target); @@ -598,48 +614,26 @@ namespace rgw::sal { return read_attrs(dpp, read_op, y, target_obj); } - int DBObject::modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) + int DBObject::modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) { rgw_obj target = get_obj(); - int r = get_obj_attrs(rctx, y, dpp, &target); + int r = get_obj_attrs(y, dpp, &target); if (r < 0) { return r; } - set_atomic(rctx); + set_atomic(); attrs[attr_name] = attr_val; - return set_obj_attrs(dpp, rctx, &attrs, nullptr, y, &target); + return set_obj_attrs(dpp, &attrs, nullptr, y); } - int DBObject::delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) + int DBObject::delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) { - rgw_obj target = get_obj(); Attrs rmattr; bufferlist bl; - set_atomic(rctx); + set_atomic(); rmattr[attr_name] = bl; - return set_obj_attrs(dpp, rctx, nullptr, &rmattr, y, &target); - } - - /* RGWObjectCtx will be moved out of sal */ - /* XXX: Placeholder. Should not be needed later after Dan's patch */ - void DBObject::set_atomic(RGWObjectCtx* rctx) const - { - return; - } - - /* RGWObjectCtx will be moved out of sal */ - /* XXX: Placeholder. Should not be needed later after Dan's patch */ - void DBObject::set_prefetch_data(RGWObjectCtx* rctx) - { - return; - } - - /* RGWObjectCtx will be moved out of sal */ - /* XXX: Placeholder. Should not be needed later after Dan's patch */ - void DBObject::set_compressed(RGWObjectCtx* rctx) - { - return; + return set_obj_attrs(dpp, nullptr, &rmattr, y); } bool DBObject::is_expired() { @@ -648,7 +642,7 @@ namespace rgw::sal { void DBObject::gen_rand_obj_instance_name() { - store->getDB()->gen_rand_obj_instance_name(&key); + store->getDB()->gen_rand_obj_instance_name(&state.obj.key); } @@ -691,8 +685,7 @@ namespace rgw::sal { return new MPDBSerializer(dpp, store, this, lock_name); } - int DBObject::transition(RGWObjectCtx& rctx, - Bucket* bucket, + int DBObject::transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, @@ -708,14 +701,14 @@ namespace rgw::sal { return true; } - int DBObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) + int DBObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) { return 0; } - std::unique_ptr DBObject::get_read_op(RGWObjectCtx* ctx) + std::unique_ptr DBObject::get_read_op() { - return std::make_unique(this, ctx); + return std::make_unique(this, nullptr); } DBObject::DBReadOp::DBReadOp(DBObject *_source, RGWObjectCtx *_rctx) : @@ -763,14 +756,13 @@ namespace rgw::sal { return parent_op.get_attr(dpp, name, dest); } - std::unique_ptr DBObject::get_delete_op(RGWObjectCtx* ctx) + std::unique_ptr DBObject::get_delete_op() { - return std::make_unique(this, ctx); + return std::make_unique(this); } - DBObject::DBDeleteOp::DBDeleteOp(DBObject *_source, RGWObjectCtx *_rctx) : + DBObject::DBDeleteOp::DBDeleteOp(DBObject *_source) : source(_source), - rctx(_rctx), op_target(_source->store->getDB(), _source->get_bucket()->get_info(), _source->get_obj()), @@ -804,9 +796,9 @@ namespace rgw::sal { return ret; } - int DBObject::delete_object(const DoutPrefixProvider* dpp, RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning) + int DBObject::delete_object(const DoutPrefixProvider* dpp, optional_yield y, bool prevent_versioning) { - DB::Object del_target(store->getDB(), bucket->get_info(), *obj_ctx, get_obj()); + DB::Object del_target(store->getDB(), bucket->get_info(), get_obj()); DB::Object::Delete del_op(&del_target); del_op.params.bucket_owner = bucket->get_info().owner; @@ -823,8 +815,7 @@ namespace rgw::sal { return 0; } - int DBObject::copy_object(RGWObjectCtx& obj_ctx, - User* user, + int DBObject::copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, @@ -860,29 +851,26 @@ namespace rgw::sal { return parent_op.iterate(dpp, ofs, end, cb); } - int DBObject::swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, + int DBObject::swift_versioning_restore(bool& restored, const DoutPrefixProvider* dpp) { return 0; } - int DBObject::swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, + int DBObject::swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) { return 0; } - int DBMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct, - RGWObjectCtx *obj_ctx) + int DBMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct) { std::unique_ptr meta_obj = get_meta_obj(); meta_obj->set_in_extra_data(true); meta_obj->set_hash_source(mp_obj.get_key()); int ret; - std::unique_ptr del_op = meta_obj->get_delete_op(obj_ctx); + std::unique_ptr del_op = meta_obj->get_delete_op(); del_op->params.bucket_owner = bucket->get_acl_owner(); del_op->params.versioning_status = 0; @@ -904,7 +892,7 @@ namespace rgw::sal { return bucket->get_object(rgw_obj_key(get_meta(), string(), mp_ns)); } - int DBMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) + int DBMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) { int ret; std::string oid = mp_obj.get_key(); @@ -1006,8 +994,7 @@ namespace rgw::sal { RGWCompressionInfo& cs_info, off_t& ofs, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) + rgw::sal::Object* target_obj) { char final_etag[CEPH_CRYPTO_MD5_DIGESTSIZE]; char final_etag_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 16]; @@ -1116,7 +1103,7 @@ namespace rgw::sal { return ret; } - int DBMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) + int DBMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) { if (!rule && !attrs) { return 0; @@ -1143,7 +1130,7 @@ namespace rgw::sal { bufferlist headbl; /* Read the obj head which contains the multipart_upload_info */ - std::unique_ptr read_op = meta_obj->get_read_op(obj_ctx); + std::unique_ptr read_op = meta_obj->get_read_op(); int ret = read_op->prepare(y, dpp); if (ret < 0) { if (ret == -ENOENT) { @@ -1192,14 +1179,14 @@ namespace rgw::sal { const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) { return std::make_unique(dpp, y, this, std::move(_head_obj), store, owner, - obj_ctx, ptail_placement_rule, part_num, part_num_str); + ptail_placement_rule, part_num, part_num_str); } DBMultipartWriter::DBMultipartWriter(const DoutPrefixProvider *dpp, @@ -1207,7 +1194,7 @@ namespace rgw::sal { MultipartUpload* upload, std::unique_ptr _head_obj, DBStore* _store, - const rgw_user& _owner, RGWObjectCtx& obj_ctx, + const rgw_user& _owner, const rgw_placement_rule *_ptail_placement_rule, uint64_t _part_num, const std::string& _part_num_str): Writer(dpp, y), @@ -1355,7 +1342,7 @@ namespace rgw::sal { optional_yield y, std::unique_ptr _head_obj, DBStore* _store, - const rgw_user& _owner, RGWObjectCtx& obj_ctx, + const rgw_user& _owner, const rgw_placement_rule *_ptail_placement_rule, uint64_t _olh_epoch, const std::string& _unique_tag) : @@ -1536,7 +1523,7 @@ namespace rgw::sal { std::unique_ptr DBStore::get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -1547,12 +1534,12 @@ namespace rgw::sal { std::unique_ptr DBStore::get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) { return std::make_unique(dpp, y, - std::move(_head_obj), this, owner, obj_ctx, + std::move(_head_obj), this, owner, ptail_placement_rule, olh_epoch, unique_tag); } @@ -1753,7 +1740,7 @@ namespace rgw::sal { std::unique_ptr DBStore::get_notification( const DoutPrefixProvider* dpp, rgw::sal::Object* obj, - rgw::sal::Object* src_obj, RGWObjectCtx* rctx, + rgw::sal::Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index c5b85095041c..b7451dc91ca4 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -404,13 +404,12 @@ protected: virtual const ACLOwner& get_owner() const override { return owner; } virtual ceph::real_time& get_mtime() { return mtime; } virtual std::unique_ptr get_meta_obj() override; - virtual int init(const DoutPrefixProvider* dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; + virtual int init(const DoutPrefixProvider* dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; virtual int list_parts(const DoutPrefixProvider* dpp, CephContext* cct, int num_parts, int marker, int* next_marker, bool* truncated, bool assume_unsorted = false) override; - virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, - RGWObjectCtx* obj_ctx) override; + virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct) override; virtual int complete(const DoutPrefixProvider* dpp, optional_yield y, CephContext* cct, std::map& part_etags, @@ -419,13 +418,12 @@ protected: RGWCompressionInfo& cs_info, off_t& ofs, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) override; - virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; + rgw::sal::Object* target_obj) override; + virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; virtual std::unique_ptr get_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) override; @@ -435,10 +433,6 @@ protected: private: DBStore* store; RGWAccessControlPolicy acls; - /* XXX: to be removed. Till Dan's patch comes, a placeholder - * for RGWObjState - */ - RGWObjState state; public: struct DBReadOp : public ReadOp { @@ -460,12 +454,11 @@ protected: struct DBDeleteOp : public DeleteOp { private: DBObject* source; - RGWObjectCtx* rctx; DB::Object op_target; DB::Object::Delete parent_op; public: - DBDeleteOp(DBObject* _source, RGWObjectCtx* _rctx); + DBDeleteOp(DBObject* _source); virtual int delete_obj(const DoutPrefixProvider* dpp, optional_yield y) override; }; @@ -485,12 +478,11 @@ protected: DBObject(DBObject& _o) = default; virtual int delete_object(const DoutPrefixProvider* dpp, - RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning = false) override; virtual int delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astate, Completions* aio, bool keep_index_consistent, optional_yield y) override; - virtual int copy_object(RGWObjectCtx& obj_ctx, User* user, + virtual int copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, rgw::sal::Bucket* dest_bucket, rgw::sal::Bucket* src_bucket, @@ -507,42 +499,36 @@ protected: 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(RGWObjectCtx* rctx) const override; - virtual void set_prefetch_data(RGWObjectCtx* rctx) override; - virtual void set_compressed(RGWObjectCtx* rctx) override; - - virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh = true) override; - virtual int set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj = NULL) override; - virtual int get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; - virtual int modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; - virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) override; + + virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **state, optional_yield y, bool follow_olh = true) override; + virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) override; + virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; + virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; + virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) override; virtual bool is_expired() override; virtual void gen_rand_obj_instance_name() override; virtual std::unique_ptr clone() override { return std::unique_ptr(new DBObject(*this)); } virtual MPSerializer* get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name) override; - virtual int transition(RGWObjectCtx& rctx, - Bucket* bucket, + virtual int transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, const DoutPrefixProvider* dpp, optional_yield y) override; virtual bool placement_rules_match(rgw_placement_rule& r1, rgw_placement_rule& r2) override; - virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) override; + virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) override; /* Swift versioning */ - virtual int swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, + virtual int swift_versioning_restore(bool& restored, const DoutPrefixProvider* dpp) override; - virtual int swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, + virtual int swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) override; /* OPs */ - virtual std::unique_ptr get_read_op(RGWObjectCtx *) override; - virtual std::unique_ptr get_delete_op(RGWObjectCtx*) override; + virtual std::unique_ptr get_read_op() override; + virtual std::unique_ptr get_delete_op() override; /* OMAP */ virtual int omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker, uint64_t count, @@ -590,7 +576,7 @@ protected: optional_yield y, std::unique_ptr _head_obj, DBStore* _store, - const rgw_user& _owner, RGWObjectCtx& obj_ctx, + const rgw_user& _owner, const rgw_placement_rule *_ptail_placement_rule, uint64_t _olh_epoch, const std::string& _unique_tag); @@ -639,7 +625,7 @@ public: optional_yield y, MultipartUpload* upload, std::unique_ptr _head_obj, DBStore* _store, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str); ~DBMultipartWriter() = default; @@ -721,7 +707,7 @@ public: virtual std::unique_ptr get_notification( const DoutPrefixProvider* dpp, rgw::sal::Object* obj, - rgw::sal::Object* src_obj, RGWObjectCtx* rctx, + rgw::sal::Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) override; @@ -780,7 +766,7 @@ public: virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -788,7 +774,7 @@ public: virtual std::unique_ptr get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) override; diff --git a/src/rgw/rgw_sal_motr.cc b/src/rgw/rgw_sal_motr.cc index 379f91df82a5..08194edf6379 100644 --- a/src/rgw/rgw_sal_motr.cc +++ b/src/rgw/rgw_sal_motr.cc @@ -893,12 +893,8 @@ std::unique_ptr MotrStore::get_lua_script_manager() return std::make_unique(this); } -int MotrObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **_state, optional_yield y, bool follow_olh) +int MotrObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **_state, optional_yield y, bool follow_olh) { - if (state == nullptr) - state = new RGWObjState(); - *_state = state; - // Get object's metadata (those stored in rgw_bucket_dir_entry). bufferlist bl; if (this->store->get_obj_meta_cache()->get(dpp, this->get_key().to_str(), bl)) { @@ -924,24 +920,22 @@ int MotrObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, this->category = ent.meta.category; // Set object state. - state->obj = get_obj(); - state->exists = true; - state->size = ent.meta.size; - state->accounted_size = ent.meta.size; - state->mtime = ent.meta.mtime; + state.exists = true; + state.size = ent.meta.size; + state.accounted_size = ent.meta.size; + state.mtime = ent.meta.mtime; - state->has_attrs = true; + state.has_attrs = true; bufferlist etag_bl; string& etag = ent.meta.etag; ldpp_dout(dpp, 20) <<__func__<< ": object's etag: " << ent.meta.etag << dendl; etag_bl.append(etag); - state->attrset[RGW_ATTR_ETAG] = etag_bl; + state.attrset[RGW_ATTR_ETAG] = etag_bl; return 0; } MotrObject::~MotrObject() { - delete state; this->close_mobj(); } @@ -955,14 +949,14 @@ MotrObject::~MotrObject() { // return read_op.prepare(dpp); // } -int MotrObject::set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj) +int MotrObject::set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) { // TODO: implement ldpp_dout(dpp, 20) <<__func__<< ": MotrObject::set_obj_attrs()" << dendl; return 0; } -int MotrObject::get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) +int MotrObject::get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) { if (this->category == RGWObjCategory::MultiMeta) return 0; @@ -1002,48 +996,27 @@ int MotrObject::get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPr return 0; } -int MotrObject::modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) +int MotrObject::modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) { rgw_obj target = get_obj(); - int r = get_obj_attrs(rctx, y, dpp, &target); + int r = get_obj_attrs(y, dpp, &target); if (r < 0) { return r; } - set_atomic(rctx); + set_atomic(); attrs[attr_name] = attr_val; - return set_obj_attrs(dpp, rctx, &attrs, nullptr, y, &target); + return set_obj_attrs(dpp, &attrs, nullptr, y); } -int MotrObject::delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) +int MotrObject::delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) { rgw_obj target = get_obj(); Attrs rmattr; bufferlist bl; - set_atomic(rctx); + set_atomic(); rmattr[attr_name] = bl; - return set_obj_attrs(dpp, rctx, nullptr, &rmattr, y, &target); -} - -/* RGWObjectCtx will be moved out of sal */ -/* XXX: Placeholder. Should not be needed later after Dan's patch */ -void MotrObject::set_atomic(RGWObjectCtx* rctx) const -{ - return; -} - -/* RGWObjectCtx will be moved out of sal */ -/* XXX: Placeholder. Should not be needed later after Dan's patch */ -void MotrObject::set_prefetch_data(RGWObjectCtx* rctx) -{ - return; -} - -/* RGWObjectCtx will be moved out of sal */ -/* XXX: Placeholder. Should not be needed later after Dan's patch */ -void MotrObject::set_compressed(RGWObjectCtx* rctx) -{ - return; + return set_obj_attrs(dpp, nullptr, &rmattr, y); } bool MotrObject::is_expired() { @@ -1057,7 +1030,7 @@ void MotrObject::gen_rand_obj_instance_name() char buf[OBJ_INSTANCE_LEN + 1]; gen_rand_alphanumeric_no_underscore(store->ctx(), buf, OBJ_INSTANCE_LEN); - key.set_instance(buf); + state.obj.key.set_instance(buf); } int MotrObject::omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker, uint64_t count, @@ -1091,8 +1064,7 @@ MPSerializer* MotrObject::get_serializer(const DoutPrefixProvider *dpp, const st return new MPMotrSerializer(dpp, store, this, lock_name); } -int MotrObject::transition(RGWObjectCtx& rctx, - Bucket* bucket, +int MotrObject::transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, @@ -1108,19 +1080,18 @@ bool MotrObject::placement_rules_match(rgw_placement_rule& r1, rgw_placement_rul return true; } -int MotrObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) +int MotrObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) { return 0; } -std::unique_ptr MotrObject::get_read_op(RGWObjectCtx* ctx) +std::unique_ptr MotrObject::get_read_op() { - return std::make_unique(this, ctx); + return std::make_unique(this); } -MotrObject::MotrReadOp::MotrReadOp(MotrObject *_source, RGWObjectCtx *_rctx) : - source(_source), - rctx(_rctx) +MotrObject::MotrReadOp::MotrReadOp(MotrObject *_source) : + source(_source) { } int MotrObject::MotrReadOp::prepare(optional_yield y, const DoutPrefixProvider* dpp) @@ -1189,14 +1160,13 @@ int MotrObject::MotrReadOp::get_attr(const DoutPrefixProvider* dpp, const char* return -ENODATA; } -std::unique_ptr MotrObject::get_delete_op(RGWObjectCtx* ctx) +std::unique_ptr MotrObject::get_delete_op() { - return std::make_unique(this, ctx); + return std::make_unique(this); } -MotrObject::MotrDeleteOp::MotrDeleteOp(MotrObject *_source, RGWObjectCtx *_rctx) : - source(_source), - rctx(_rctx) +MotrObject::MotrDeleteOp::MotrDeleteOp(MotrObject *_source) : + source(_source) { } // Implementation of DELETE OBJ also requires MotrObject::get_obj_state() @@ -1240,9 +1210,9 @@ int MotrObject::MotrDeleteOp::delete_obj(const DoutPrefixProvider* dpp, optional return 0; } -int MotrObject::delete_object(const DoutPrefixProvider* dpp, RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning) +int MotrObject::delete_object(const DoutPrefixProvider* dpp, optional_yield y, bool prevent_versioning) { - MotrObject::MotrDeleteOp del_op(this, obj_ctx); + MotrObject::MotrDeleteOp del_op(this); del_op.params.bucket_owner = bucket->get_info().owner; del_op.params.versioning_status = bucket->get_info().versioning_status(); @@ -1257,8 +1227,7 @@ int MotrObject::delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astat return 0; } -int MotrObject::copy_object(RGWObjectCtx& obj_ctx, - User* user, +int MotrObject::copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, @@ -1289,15 +1258,13 @@ int MotrObject::copy_object(RGWObjectCtx& obj_ctx, return 0; } -int MotrObject::swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, +int MotrObject::swift_versioning_restore(bool& restored, const DoutPrefixProvider* dpp) { return 0; } -int MotrObject::swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, +int MotrObject::swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) { return 0; @@ -1307,7 +1274,7 @@ MotrAtomicWriter::MotrAtomicWriter(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, MotrStore* _store, - const rgw_user& _owner, RGWObjectCtx& obj_ctx, + const rgw_user& _owner, const rgw_placement_rule *_ptail_placement_rule, uint64_t _olh_epoch, const std::string& _unique_tag) : @@ -2178,8 +2145,7 @@ int MotrMultipartUpload::delete_parts(const DoutPrefixProvider *dpp) return store->delete_motr_idx_by_name(obj_part_iname); } -int MotrMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct, - RGWObjectCtx *obj_ctx) +int MotrMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct) { int rc; @@ -2226,7 +2192,7 @@ struct motr_multipart_upload_info WRITE_CLASS_ENCODER(motr_multipart_upload_info) int MotrMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, - RGWObjectCtx* obj_ctx, ACLOwner& _owner, + ACLOwner& _owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) { int rc; @@ -2367,8 +2333,7 @@ int MotrMultipartUpload::complete(const DoutPrefixProvider *dpp, RGWCompressionInfo& cs_info, off_t& off, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) + rgw::sal::Object* target_obj) { char final_etag[CEPH_CRYPTO_MD5_DIGESTSIZE]; char final_etag_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 16]; @@ -2571,7 +2536,7 @@ int MotrMultipartUpload::complete(const DoutPrefixProvider *dpp, M0_IC_DEL, meta_obj->get_key().to_str(), bl); } -int MotrMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) +int MotrMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) { if (!rule && !attrs) { return 0; @@ -2637,14 +2602,14 @@ std::unique_ptr MotrMultipartUpload::get_writer( const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) { return std::make_unique(dpp, y, this, std::move(_head_obj), store, owner, - obj_ctx, ptail_placement_rule, part_num, part_num_str); + ptail_placement_rule, part_num, part_num_str); } int MotrMultipartWriter::prepare(optional_yield y) @@ -2775,7 +2740,7 @@ std::unique_ptr MotrBucket::get_multipart_upload(const std::str std::unique_ptr MotrStore::get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -2786,12 +2751,12 @@ std::unique_ptr MotrStore::get_append_writer(const DoutPrefixProvider *d std::unique_ptr MotrStore::get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) { return std::make_unique(dpp, y, - std::move(_head_obj), this, owner, obj_ctx, + std::move(_head_obj), this, owner, ptail_placement_rule, olh_epoch, unique_tag); } @@ -2924,7 +2889,7 @@ std::unique_ptr MotrStore::get_notification(Object* obj, Object* s } std::unique_ptr MotrStore::get_notification(const DoutPrefixProvider* dpp, Object* obj, - Object* src_obj, RGWObjectCtx* rctx, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, + Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) { return std::make_unique(obj, src_obj, event_type); diff --git a/src/rgw/rgw_sal_motr.h b/src/rgw/rgw_sal_motr.h index f340f23afab6..52fa8847722d 100644 --- a/src/rgw/rgw_sal_motr.h +++ b/src/rgw/rgw_sal_motr.h @@ -425,11 +425,6 @@ class MotrObject : public Object { private: MotrStore *store; RGWAccessControlPolicy acls; - /* XXX: to be removed. Till Dan's patch comes, a placeholder - * for RGWObjState - */ - RGWObjState *state; - RGWObjCategory category; // If this object is pat of a multipart uploaded one. @@ -475,14 +470,13 @@ class MotrObject : public Object { struct MotrReadOp : public ReadOp { private: MotrObject* source; - RGWObjectCtx* rctx; // The set of part objects if the source is // a multipart uploaded object. std::map> part_objs; public: - MotrReadOp(MotrObject *_source, RGWObjectCtx *_rctx); + MotrReadOp(MotrObject *_source); virtual int prepare(optional_yield y, const DoutPrefixProvider* dpp) override; virtual int read(int64_t off, int64_t end, bufferlist& bl, optional_yield y, const DoutPrefixProvider* dpp) override; @@ -493,10 +487,9 @@ class MotrObject : public Object { struct MotrDeleteOp : public DeleteOp { private: MotrObject* source; - RGWObjectCtx* rctx; public: - MotrDeleteOp(MotrObject* _source, RGWObjectCtx* _rctx); + MotrDeleteOp(MotrObject* _source); virtual int delete_obj(const DoutPrefixProvider* dpp, optional_yield y) override; }; @@ -504,21 +497,20 @@ class MotrObject : public Object { MotrObject() = default; MotrObject(MotrStore *_st, const rgw_obj_key& _k) - : Object(_k), store(_st), acls(), state(NULL) {} + : Object(_k), store(_st), acls() {} MotrObject(MotrStore *_st, const rgw_obj_key& _k, Bucket* _b) - : Object(_k, _b), store(_st), acls(), state(NULL) {} + : Object(_k, _b), store(_st), acls() {} MotrObject(MotrObject& _o) = default; virtual ~MotrObject(); virtual int delete_object(const DoutPrefixProvider* dpp, - RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning = false) override; virtual int delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astate, Completions* aio, bool keep_index_consistent, optional_yield y) override; - virtual int copy_object(RGWObjectCtx& obj_ctx, User* user, + virtual int copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, rgw::sal::Bucket* dest_bucket, rgw::sal::Bucket* src_bucket, @@ -535,42 +527,35 @@ class MotrObject : public Object { 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(RGWObjectCtx* rctx) const override; - virtual void set_prefetch_data(RGWObjectCtx* rctx) override; - virtual void set_compressed(RGWObjectCtx* rctx) override; - - virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh = true) override; - virtual int set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj = NULL) override; - virtual int get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; - virtual int modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; - virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) override; + virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **state, optional_yield y, bool follow_olh = true) override; + virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) override; + virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; + virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; + virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) override; virtual bool is_expired() override; virtual void gen_rand_obj_instance_name() override; virtual std::unique_ptr clone() override { return std::unique_ptr(new MotrObject(*this)); } virtual MPSerializer* get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name) override; - virtual int transition(RGWObjectCtx& rctx, - Bucket* bucket, + virtual int transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, const DoutPrefixProvider* dpp, optional_yield y) override; virtual bool placement_rules_match(rgw_placement_rule& r1, rgw_placement_rule& r2) override; - virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) override; + virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) override; /* Swift versioning */ - virtual int swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, + virtual int swift_versioning_restore(bool& restored, const DoutPrefixProvider* dpp) override; - virtual int swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, + virtual int swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) override; /* OPs */ - virtual std::unique_ptr get_read_op(RGWObjectCtx *) override; - virtual std::unique_ptr get_delete_op(RGWObjectCtx*) override; + virtual std::unique_ptr get_read_op() override; + virtual std::unique_ptr get_delete_op() override; /* OMAP */ virtual int omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker, uint64_t count, @@ -641,7 +626,7 @@ class MotrAtomicWriter : public Writer { optional_yield y, std::unique_ptr _head_obj, MotrStore* _store, - const rgw_user& _owner, RGWObjectCtx& obj_ctx, + const rgw_user& _owner, const rgw_placement_rule *_ptail_placement_rule, uint64_t _olh_epoch, const std::string& _unique_tag); @@ -687,7 +672,7 @@ public: optional_yield y, MultipartUpload* upload, std::unique_ptr _head_obj, MotrStore* _store, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t _part_num, const std::string& part_num_str) : Writer(dpp, y), store(_store), head_obj(std::move(_head_obj)), @@ -780,13 +765,12 @@ public: virtual const ACLOwner& get_owner() const override { return owner; } virtual ceph::real_time& get_mtime() { return mtime; } virtual std::unique_ptr get_meta_obj() override; - virtual int init(const DoutPrefixProvider* dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; + virtual int init(const DoutPrefixProvider* dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; virtual int list_parts(const DoutPrefixProvider* dpp, CephContext* cct, int num_parts, int marker, int* next_marker, bool* truncated, bool assume_unsorted = false) override; - virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, - RGWObjectCtx* obj_ctx) override; + virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct) override; virtual int complete(const DoutPrefixProvider* dpp, optional_yield y, CephContext* cct, std::map& part_etags, @@ -795,13 +779,12 @@ public: RGWCompressionInfo& cs_info, off_t& off, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) override; - virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; + rgw::sal::Object* target_obj) override; + virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; virtual std::unique_ptr get_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) override; @@ -859,7 +842,7 @@ class MotrStore : public Store { virtual std::unique_ptr get_notification(rgw::sal::Object* obj, rgw::sal::Object* src_obj, struct req_state* s, rgw::notify::EventType event_type, const std::string* object_name=nullptr) override; virtual std::unique_ptr get_notification(const DoutPrefixProvider* dpp, rgw::sal::Object* obj, - rgw::sal::Object* src_obj, RGWObjectCtx* rctx, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, + rgw::sal::Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) override; virtual RGWLC* get_rgwlc(void) override { return NULL; } virtual RGWCoroutinesManagerRegistry* get_cr_registry() override { return NULL; } @@ -916,7 +899,7 @@ class MotrStore : public Store { virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -924,7 +907,7 @@ class MotrStore : public Store { virtual std::unique_ptr get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) override; diff --git a/src/rgw/rgw_sal_rados.cc b/src/rgw/rgw_sal_rados.cc index 8c9f9ef031b7..bf08e8cafa8a 100644 --- a/src/rgw/rgw_sal_rados.cc +++ b/src/rgw/rgw_sal_rados.cc @@ -494,9 +494,12 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool std::vector::iterator it = results.objs.begin(); for (; it != results.objs.end(); ++it) { RGWObjState *astate = NULL; + RGWObjManifest *amanifest = nullptr; std::unique_ptr obj = get_object((*it).key); - ret = obj->get_obj_state(dpp, &obj_ctx, &astate, y, false); + ret = store->getRados()->get_obj_state(dpp, &obj_ctx, obj->get_bucket()->get_info(), + obj.get(), &astate, &amanifest, + false, y); if (ret == -ENOENT) { ldpp_dout(dpp, 1) << "WARNING: cannot find obj state for obj " << obj << dendl; continue; @@ -506,8 +509,8 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool return ret; } - if (astate->manifest) { - RGWObjManifest& manifest = *astate->manifest; + if (amanifest) { + RGWObjManifest& manifest = *amanifest; RGWObjManifest::obj_iterator miter = manifest.obj_begin(dpp); std::unique_ptr head_obj = get_object(manifest.get_obj().key); rgw_raw_obj raw_head_obj; @@ -919,7 +922,6 @@ int RadosBucket::abort_multiparts(const DoutPrefixProvider* dpp, constexpr int max = 1000; int ret, num_deleted = 0; vector> uploads; - RGWObjectCtx obj_ctx(store); string marker; bool is_truncated; @@ -942,7 +944,7 @@ int RadosBucket::abort_multiparts(const DoutPrefixProvider* dpp, if (!uploads.empty()) { for (const auto& upload : uploads) { - ret = upload->abort(dpp, cct, &obj_ctx); + ret = upload->abort(dpp, cct); if (ret < 0) { // we're doing a best-effort; if something cannot be found, // log it and keep moving forward @@ -1164,9 +1166,9 @@ std::unique_ptr RadosStore::get_notification( return std::make_unique(s, this, obj, src_obj, s, event_type, object_name); } -std::unique_ptr RadosStore::get_notification(const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, RGWObjectCtx* rctx, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) +std::unique_ptr RadosStore::get_notification(const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) { - return std::make_unique(dpp, this, obj, src_obj, rctx, event_type, _bucket, _user_id, _user_tenant, _req_id, y); + return std::make_unique(dpp, this, obj, src_obj, event_type, _bucket, _user_id, _user_tenant, _req_id, y); } int RadosStore::delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj) @@ -1440,7 +1442,7 @@ int RadosStore::get_oidc_providers(const DoutPrefixProvider *dpp, std::unique_ptr RadosStore::get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, @@ -1449,7 +1451,7 @@ std::unique_ptr RadosStore::get_append_writer(const DoutPrefixProvider * auto aio = rgw::make_throttle(ctx()->_conf->rgw_put_obj_min_window_size, y); return std::make_unique(dpp, y, std::move(_head_obj), - this, std::move(aio), owner, obj_ctx, + this, std::move(aio), owner, ptail_placement_rule, unique_tag, position, cur_accounted_size); @@ -1458,7 +1460,7 @@ std::unique_ptr RadosStore::get_append_writer(const DoutPrefixProvider * std::unique_ptr RadosStore::get_atomic_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) @@ -1466,7 +1468,7 @@ std::unique_ptr RadosStore::get_atomic_writer(const DoutPrefixProvider * auto aio = rgw::make_throttle(ctx()->_conf->rgw_put_obj_min_window_size, y); return std::make_unique(dpp, y, std::move(_head_obj), - this, std::move(aio), owner, obj_ctx, + this, std::move(aio), owner, ptail_placement_rule, olh_epoch, unique_tag); } @@ -1476,84 +1478,89 @@ int RadosStore::get_obj_head_ioctx(const DoutPrefixProvider *dpp, const RGWBucke return rados->get_obj_head_ioctx(dpp, bucket_info, obj, ioctx); } -RadosObject::~RadosObject() {} +RadosObject::~RadosObject() +{ + if (rados_ctx_owned) + delete rados_ctx; +} -int RadosObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh) +int RadosObject::get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **pstate, optional_yield y, bool follow_olh) { - return store->getRados()->get_obj_state(dpp, rctx, bucket->get_info(), get_obj(), state, follow_olh, y); + int ret = store->getRados()->get_obj_state(dpp, rados_ctx, bucket->get_info(), this, pstate, &manifest, follow_olh, y); + if (ret < 0) { + return ret; + } + + /* Don't overwrite obj, atomic, or prefetch */ + rgw_obj obj = get_obj(); + bool is_atomic = state.is_atomic; + bool prefetch_data = state.prefetch_data; + + state = **pstate; + + state.obj = obj; + state.is_atomic = is_atomic; + state.prefetch_data = prefetch_data; + return ret; } int RadosObject::read_attrs(const DoutPrefixProvider* dpp, RGWRados::Object::Read &read_op, optional_yield y, rgw_obj* target_obj) { read_op.params.attrs = &attrs; read_op.params.target_obj = target_obj; - read_op.params.obj_size = &obj_size; - read_op.params.lastmod = &mtime; + read_op.params.obj_size = &state.size; + read_op.params.lastmod = &state.mtime; return read_op.prepare(y, dpp); } -int RadosObject::set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj) +int RadosObject::set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) { Attrs empty; - rgw_obj target = get_obj(); - - if (!target_obj) - target_obj = ⌖ - - return store->getRados()->set_attrs(dpp, rctx, + return store->getRados()->set_attrs(dpp, rados_ctx, bucket->get_info(), - *target_obj, + this, setattrs ? *setattrs : empty, delattrs ? delattrs : nullptr, y); } -int RadosObject::get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) +int RadosObject::get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj) { - RGWRados::Object op_target(store->getRados(), bucket->get_info(), *rctx, get_obj()); + RGWRados::Object op_target(store->getRados(), bucket, *rados_ctx, this); RGWRados::Object::Read read_op(&op_target); return read_attrs(dpp, read_op, y, target_obj); } -int RadosObject::modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) +int RadosObject::modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) { rgw_obj target = get_obj(); - int r = get_obj_attrs(rctx, y, dpp, &target); + rgw_obj save = get_obj(); + int r = get_obj_attrs(y, dpp, &target); if (r < 0) { return r; } - set_atomic(rctx); + + /* Temporarily set target */ + state.obj = target; + set_atomic(); attrs[attr_name] = attr_val; - return set_obj_attrs(dpp, rctx, &attrs, nullptr, y, &target); + r = set_obj_attrs(dpp, &attrs, nullptr, y); + /* Restore target */ + state.obj = save; + + return r; } -int RadosObject::delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) +int RadosObject::delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) { Attrs rmattr; bufferlist bl; - set_atomic(rctx); + set_atomic(); rmattr[attr_name] = bl; - return set_obj_attrs(dpp, rctx, nullptr, &rmattr, y); -} - -void RadosObject::set_compressed(RGWObjectCtx* rctx) { - rgw_obj obj = get_obj(); - store->getRados()->set_compressed(rctx, obj); -} - -void RadosObject::set_atomic(RGWObjectCtx* rctx) const -{ - rgw_obj obj = get_obj(); - store->getRados()->set_atomic(rctx, obj); -} - -void RadosObject::set_prefetch_data(RGWObjectCtx* rctx) -{ - rgw_obj obj = get_obj(); - store->getRados()->set_prefetch_data(rctx, obj); + return set_obj_attrs(dpp, nullptr, &rmattr, y); } bool RadosObject::is_expired() { @@ -1578,7 +1585,7 @@ bool RadosObject::is_expired() { void RadosObject::gen_rand_obj_instance_name() { - store->getRados()->gen_rand_obj_instance_name(&key); + store->getRados()->gen_rand_obj_instance_name(&state.obj.key); } void RadosObject::raw_obj_to_obj(const rgw_raw_obj& raw_obj) @@ -1653,15 +1660,14 @@ MPSerializer* RadosObject::get_serializer(const DoutPrefixProvider *dpp, const s return new MPRadosSerializer(dpp, store, this, lock_name); } -int RadosObject::transition(RGWObjectCtx& rctx, - Bucket* bucket, - const rgw_placement_rule& placement_rule, - const real_time& mtime, - uint64_t olh_epoch, - const DoutPrefixProvider* dpp, - optional_yield y) +int RadosObject::transition(Bucket* bucket, + const rgw_placement_rule& placement_rule, + const real_time& mtime, + uint64_t olh_epoch, + const DoutPrefixProvider* dpp, + optional_yield y) { - return store->getRados()->transition_obj(rctx, bucket, *this, placement_rule, mtime, olh_epoch, dpp, y); + return store->getRados()->transition_obj(*rados_ctx, bucket, *this, placement_rule, mtime, olh_epoch, dpp, y); } int RadosObject::get_max_chunk_size(const DoutPrefixProvider* dpp, rgw_placement_rule placement_rule, uint64_t* max_chunk_size, uint64_t* alignment) @@ -1695,14 +1701,13 @@ bool RadosObject::placement_rules_match(rgw_placement_rule& r1, rgw_placement_ru return p1 == p2; } -int RadosObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) +int RadosObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) { int ret; - RGWObjManifest *manifest{nullptr}; + RGWObjManifest *amanifest{nullptr}; rgw_raw_obj head_obj; - RGWRados::Object op_target(store->getRados(), get_bucket()->get_info(), - *obj_ctx, get_obj()); + RGWRados::Object op_target(store->getRados(), get_bucket(), *rados_ctx, this); RGWRados::Object::Read parent_op(&op_target); uint64_t obj_size; @@ -1716,19 +1721,19 @@ int RadosObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y head_obj = parent_op.state.head_obj; - ret = op_target.get_manifest(dpp, &manifest, y); + ret = op_target.get_manifest(dpp, &amanifest, y); if (ret < 0) { return ret; } ::encode_json("head", head_obj, f); - ::encode_json("manifest", *manifest, f); + ::encode_json("manifest", *amanifest, f); f->open_array_section("data_location"); - for (auto miter = manifest->obj_begin(dpp); miter != manifest->obj_end(dpp); ++miter) { + for (auto miter = amanifest->obj_begin(dpp); miter != amanifest->obj_end(dpp); ++miter) { f->open_object_section("obj"); rgw_raw_obj raw_loc = miter.get_location().get_raw_obj(store); uint64_t ofs = miter.get_ofs(); - uint64_t left = manifest->get_obj_size() - ofs; + uint64_t left = amanifest->get_obj_size() - ofs; ::encode_json("ofs", miter.get_ofs(), f); ::encode_json("loc", raw_loc, f); ::encode_json("loc_ofs", miter.location_ofs(), f); @@ -1744,18 +1749,18 @@ int RadosObject::dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y return 0; } -std::unique_ptr RadosObject::get_read_op(RGWObjectCtx* ctx) +std::unique_ptr RadosObject::get_read_op() { - return std::make_unique(this, ctx); + return std::make_unique(this, rados_ctx); } RadosObject::RadosReadOp::RadosReadOp(RadosObject *_source, RGWObjectCtx *_rctx) : source(_source), rctx(_rctx), op_target(_source->store->getRados(), - _source->get_bucket()->get_info(), + _source->get_bucket(), *static_cast(rctx), - _source->get_obj()), + _source), parent_op(&op_target) { } @@ -1795,18 +1800,17 @@ int RadosObject::RadosReadOp::get_attr(const DoutPrefixProvider* dpp, const char return parent_op.get_attr(dpp, name, dest, y); } -std::unique_ptr RadosObject::get_delete_op(RGWObjectCtx* ctx) +std::unique_ptr RadosObject::get_delete_op() { - return std::make_unique(this, ctx); + return std::make_unique(this); } -RadosObject::RadosDeleteOp::RadosDeleteOp(RadosObject *_source, RGWObjectCtx *_rctx) : +RadosObject::RadosDeleteOp::RadosDeleteOp(RadosObject *_source) : source(_source), - rctx(_rctx), op_target(_source->store->getRados(), - _source->get_bucket()->get_info(), - *static_cast(rctx), - _source->get_obj()), + _source->get_bucket(), + _source->get_ctx(), + _source), parent_op(&op_target) { } @@ -1838,11 +1842,10 @@ int RadosObject::RadosDeleteOp::delete_obj(const DoutPrefixProvider* dpp, option } int RadosObject::delete_object(const DoutPrefixProvider* dpp, - RGWObjectCtx* obj_ctx, optional_yield y, bool prevent_versioning) { - RGWRados::Object del_target(store->getRados(), bucket->get_info(), *obj_ctx, get_obj()); + RGWRados::Object del_target(store->getRados(), bucket, *rados_ctx, this); RGWRados::Object::Delete del_op(&del_target); del_op.params.bucket_owner = bucket->get_info().owner; @@ -1861,8 +1864,7 @@ int RadosObject::delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* asta raio->handles, keep_index_consistent, y); } -int RadosObject::copy_object(RGWObjectCtx& obj_ctx, - User* user, +int RadosObject::copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, @@ -1890,7 +1892,7 @@ int RadosObject::copy_object(RGWObjectCtx& obj_ctx, const DoutPrefixProvider* dpp, optional_yield y) { - return store->getRados()->copy_obj(obj_ctx, + return store->getRados()->copy_obj(*rados_ctx, user->get_id(), info, source_zone, @@ -1926,11 +1928,10 @@ int RadosObject::RadosReadOp::iterate(const DoutPrefixProvider* dpp, int64_t ofs return parent_op.iterate(dpp, ofs, end, cb, y); } -int RadosObject::swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, - const DoutPrefixProvider* dpp) +int RadosObject::swift_versioning_restore(bool& restored, + const DoutPrefixProvider* dpp) { - return store->getRados()->swift_versioning_restore(*obj_ctx, + return store->getRados()->swift_versioning_restore(*rados_ctx, bucket->get_owner()->get_id(), bucket, this, @@ -1938,11 +1939,9 @@ int RadosObject::swift_versioning_restore(RGWObjectCtx* obj_ctx, dpp); } -int RadosObject::swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, - optional_yield y) +int RadosObject::swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) { - return store->getRados()->swift_versioning_copy(*obj_ctx, + return store->getRados()->swift_versioning_copy(*rados_ctx, bucket->get_info().owner, bucket, this, @@ -1950,8 +1949,7 @@ int RadosObject::swift_versioning_copy(RGWObjectCtx* obj_ctx, y); } -int RadosMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct, - RGWObjectCtx *obj_ctx) +int RadosMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct) { std::unique_ptr meta_obj = get_meta_obj(); meta_obj->set_in_extra_data(true); @@ -1979,7 +1977,7 @@ int RadosMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct, std::unique_ptr obj = bucket->get_object( rgw_obj_key(obj_part->oid, std::string(), RGW_OBJ_NS_MULTIPART)); obj->set_hash_source(mp_obj.get_key()); - ret = obj->delete_object(dpp, obj_ctx, null_yield); + ret = obj->delete_object(dpp, null_yield); if (ret < 0 && ret != -ENOENT) return ret; } else { @@ -2016,7 +2014,7 @@ int RadosMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct, } } - std::unique_ptr del_op = meta_obj->get_delete_op(obj_ctx); + std::unique_ptr del_op = meta_obj->get_delete_op(); del_op->params.bucket_owner = bucket->get_acl_owner(); del_op->params.versioning_status = 0; if (!remove_objs.empty()) { @@ -2040,10 +2038,11 @@ std::unique_ptr RadosMultipartUpload::get_meta_obj() return bucket->get_object(rgw_obj_key(get_meta(), string(), mp_ns)); } -int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) +int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) { int ret; std::string oid = mp_obj.get_key(); + RGWObjectCtx obj_ctx(store); do { char buf[33]; @@ -2062,8 +2061,8 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, obj->set_hash_source(oid); RGWRados::Object op_target(store->getRados(), - obj->get_bucket()->get_info(), - *obj_ctx, obj->get_obj()); + obj->get_bucket(), + obj_ctx, obj.get()); RGWRados::Object::Write obj_op(&op_target); op_target.set_versioning_disabled(true); /* no versioning for multipart meta */ @@ -2193,8 +2192,7 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, RGWCompressionInfo& cs_info, off_t& ofs, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) + rgw::sal::Object* target_obj) { char final_etag[CEPH_CRYPTO_MD5_DIGESTSIZE]; char final_etag_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 16]; @@ -2334,11 +2332,12 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, attrs[RGW_ATTR_COMPRESSION] = tmp; } - target_obj->set_atomic(obj_ctx); + target_obj->set_atomic(); RGWRados::Object op_target(store->getRados(), - target_obj->get_bucket()->get_info(), - *obj_ctx, target_obj->get_obj()); + target_obj->get_bucket(), + dynamic_cast(target_obj)->get_ctx(), + target_obj); RGWRados::Object::Write obj_op(&op_target); obj_op.meta.manifest = &manifest; @@ -2358,7 +2357,7 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, return ret; } -int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) +int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs) { if (!rule && !attrs) { return 0; @@ -2385,8 +2384,8 @@ int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield bufferlist headbl; /* Read the obj head which contains the multipart_upload_info */ - std::unique_ptr read_op = meta_obj->get_read_op(obj_ctx); - meta_obj->set_prefetch_data(obj_ctx); + std::unique_ptr read_op = meta_obj->get_read_op(); + meta_obj->set_prefetch_data(); int ret = read_op->prepare(y, dpp); if (ret < 0) { @@ -2438,7 +2437,7 @@ std::unique_ptr RadosMultipartUpload::get_writer( const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) @@ -2446,7 +2445,7 @@ std::unique_ptr RadosMultipartUpload::get_writer( auto aio = rgw::make_throttle(store->ctx()->_conf->rgw_put_obj_min_window_size, y); return std::make_unique(dpp, y, this, std::move(_head_obj), store, std::move(aio), owner, - obj_ctx, ptail_placement_rule, part_num, part_num_str); + ptail_placement_rule, part_num, part_num_str); } MPRadosSerializer::MPRadosSerializer(const DoutPrefixProvider *dpp, RadosStore* store, RadosObject* obj, const std::string& lock_name) : diff --git a/src/rgw/rgw_sal_rados.h b/src/rgw/rgw_sal_rados.h index 4e4673c03280..8d61af2e7fc1 100644 --- a/src/rgw/rgw_sal_rados.h +++ b/src/rgw/rgw_sal_rados.h @@ -27,7 +27,6 @@ namespace rgw { namespace sal { -class RadosStore; class RadosMultipartUpload; class RadosCompletions : public Completions { @@ -38,6 +37,164 @@ class RadosCompletions : public Completions { virtual int drain() override; }; +class RadosZone : public Zone { + protected: + RadosStore* store; + public: + RadosZone(RadosStore* _store) : store(_store) {} + ~RadosZone() = default; + + virtual const RGWZoneGroup& get_zonegroup() override; + virtual int get_zonegroup(const std::string& id, RGWZoneGroup& zonegroup) override; + virtual const RGWZoneParams& get_params() override; + virtual const rgw_zone_id& get_id() override; + virtual const RGWRealm& get_realm() override; + virtual const std::string& get_name() const override; + virtual bool is_writeable() override; + virtual bool get_redirect_endpoint(std::string* endpoint) override; + virtual bool has_zonegroup_api(const std::string& api) const override; + virtual const std::string& get_current_period_id() override; +}; + +class RadosStore : public Store { + private: + RGWRados* rados; + RGWUserCtl* user_ctl; + std::string luarocks_path; + RadosZone zone; + + public: + RadosStore() + : rados(nullptr), zone(this) { + } + ~RadosStore() { + delete rados; + } + + virtual const char* get_name() const override { + return "rados"; + } + virtual std::string get_cluster_id(const DoutPrefixProvider* dpp, optional_yield y) override; + virtual std::unique_ptr get_user(const rgw_user& u) override; + virtual int get_user_by_access_key(const DoutPrefixProvider* dpp, const std::string& key, optional_yield y, std::unique_ptr* user) override; + virtual int get_user_by_email(const DoutPrefixProvider* dpp, const std::string& email, optional_yield y, std::unique_ptr* user) override; + virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const std::string& user_str, optional_yield y, std::unique_ptr* user) override; + virtual std::unique_ptr get_object(const rgw_obj_key& k) override; + virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) override; + virtual int get_bucket(User* u, const RGWBucketInfo& i, std::unique_ptr* bucket) override; + virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const std::string& tenant, const std::string&name, std::unique_ptr* bucket, optional_yield y) override; + virtual bool is_meta_master() override; + virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv, + bufferlist& in_data, JSONParser* jp, req_info& info, + optional_yield y) override; + virtual Zone* get_zone() { return &zone; } + virtual std::string zone_unique_id(uint64_t unique_num) override; + virtual std::string zone_unique_trans_id(const uint64_t unique_num) override; + virtual int cluster_stat(RGWClusterStat& stats) override; + virtual std::unique_ptr get_lifecycle(void) override; + virtual std::unique_ptr get_completions(void) override; + virtual std::unique_ptr get_notification(rgw::sal::Object* obj, rgw::sal::Object* src_obj, struct req_state* s, rgw::notify::EventType event_type, const std::string* object_name=nullptr) override; + virtual std::unique_ptr get_notification( + const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, + rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, + std::string& _req_id, optional_yield y) override; + virtual RGWLC* get_rgwlc(void) override { return rados->get_lc(); } + virtual RGWCoroutinesManagerRegistry* get_cr_registry() override { return rados->get_cr_registry(); } + + virtual int log_usage(const DoutPrefixProvider *dpp, std::map& usage_info) override; + virtual int log_op(const DoutPrefixProvider *dpp, std::string& oid, bufferlist& bl) override; + virtual int register_to_service_map(const DoutPrefixProvider *dpp, const std::string& daemon_type, + const std::map& meta) override; + virtual void get_quota(RGWQuotaInfo& bucket_quota, RGWQuotaInfo& user_quota) override; + virtual void get_ratelimit(RGWRateLimitInfo& bucket_ratelimit, RGWRateLimitInfo& user_ratelimit, RGWRateLimitInfo& anon_ratelimit) override; + virtual int set_buckets_enabled(const DoutPrefixProvider* dpp, std::vector& buckets, bool enabled) override; + virtual uint64_t get_new_req_id() override { return rados->get_new_req_id(); } + virtual int get_sync_policy_handler(const DoutPrefixProvider* dpp, + std::optional zone, + std::optional bucket, + RGWBucketSyncPolicyHandlerRef* phandler, + optional_yield y) override; + virtual RGWDataSyncStatusManager* get_data_sync_manager(const rgw_zone_id& source_zone) override; + virtual void wakeup_meta_sync_shards(std::set& shard_ids) override { rados->wakeup_meta_sync_shards(shard_ids); } + virtual void wakeup_data_sync_shards(const DoutPrefixProvider *dpp, const rgw_zone_id& source_zone, std::map >& shard_ids) override { rados->wakeup_data_sync_shards(dpp, source_zone, shard_ids); } + virtual int clear_usage(const DoutPrefixProvider *dpp) override { return rados->clear_usage(dpp); } + virtual int read_all_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, + uint32_t max_entries, bool* is_truncated, + RGWUsageIter& usage_iter, + std::map& usage) override; + virtual int trim_all_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch) override; + virtual int get_config_key_val(std::string name, bufferlist* bl) override; + virtual int meta_list_keys_init(const DoutPrefixProvider *dpp, const std::string& section, const std::string& marker, void** phandle) override; + virtual int meta_list_keys_next(const DoutPrefixProvider *dpp, void* handle, int max, std::list& keys, bool* truncated) override; + virtual void meta_list_keys_complete(void* handle) override; + virtual std::string meta_get_marker(void* handle) override; + virtual int meta_remove(const DoutPrefixProvider* dpp, std::string& metadata_key, optional_yield y) override; + virtual const RGWSyncModuleInstanceRef& get_sync_module() { return rados->get_sync_module(); } + virtual std::string get_host_id() { return rados->host_id; } + virtual std::unique_ptr get_lua_script_manager() override; + virtual std::unique_ptr get_role(std::string name, + std::string tenant, + std::string path="", + std::string trust_policy="", + std::string max_session_duration_str="", + std::multimap tags={}) override; + virtual std::unique_ptr get_role(std::string id) override; + virtual int get_roles(const DoutPrefixProvider *dpp, + optional_yield y, + const std::string& path_prefix, + const std::string& tenant, + std::vector>& roles) override; + virtual std::unique_ptr get_oidc_provider() override; + virtual int get_oidc_providers(const DoutPrefixProvider *dpp, + const std::string& tenant, + std::vector>& providers) override; + virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, + optional_yield y, + std::unique_ptr _head_obj, + const rgw_user& owner, + const rgw_placement_rule *ptail_placement_rule, + const std::string& unique_tag, + uint64_t position, + uint64_t *cur_accounted_size) override; + virtual std::unique_ptr get_atomic_writer(const DoutPrefixProvider *dpp, + optional_yield y, + std::unique_ptr _head_obj, + const rgw_user& owner, + const rgw_placement_rule *ptail_placement_rule, + uint64_t olh_epoch, + const std::string& unique_tag) override; + + virtual void finalize(void) override; + + virtual CephContext* ctx(void) override { return rados->ctx(); } + + virtual const std::string& get_luarocks_path() const override { + return luarocks_path; + } + + virtual void set_luarocks_path(const std::string& path) override { + luarocks_path = path; + } + + /* Unique to RadosStore */ + int get_obj_head_ioctx(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, + librados::IoCtx* ioctx); + int delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj); + int delete_raw_obj_aio(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, Completions* aio); + void get_raw_obj(const rgw_placement_rule& placement_rule, const rgw_obj& obj, rgw_raw_obj* raw_obj); + int get_raw_chunk_size(const DoutPrefixProvider* dpp, const rgw_raw_obj& obj, uint64_t* chunk_size); + + void setRados(RGWRados * st) { rados = st; } + RGWRados* getRados(void) { return rados; } + + RGWServices* svc() { return &rados->svc; } + const RGWServices* svc() const { return &rados->svc; } + RGWCtl* ctl() { return &rados->ctl; } + const RGWCtl* ctl() const { return &rados->ctl; } + + void setUserCtl(RGWUserCtl *_ctl) { user_ctl = _ctl; } +}; + class RadosUser : public User { private: RadosStore* store; @@ -95,6 +252,9 @@ class RadosObject : public Object { private: RadosStore* store; RGWAccessControlPolicy acls; + RGWObjManifest *manifest{nullptr}; + RGWObjectCtx* rados_ctx; + bool rados_ctx_owned; public: @@ -117,12 +277,11 @@ class RadosObject : public Object { struct RadosDeleteOp : public DeleteOp { private: RadosObject* source; - RGWObjectCtx* rctx; RGWRados::Object op_target; RGWRados::Object::Delete parent_op; public: - RadosDeleteOp(RadosObject* _source, RGWObjectCtx* _rctx); + RadosDeleteOp(RadosObject* _source); virtual int delete_obj(const DoutPrefixProvider* dpp, optional_yield y) override; }; @@ -132,22 +291,32 @@ class RadosObject : public Object { RadosObject(RadosStore *_st, const rgw_obj_key& _k) : Object(_k), store(_st), - acls() { + acls(), + rados_ctx(new RGWObjectCtx(dynamic_cast(store))), + rados_ctx_owned(true) { } RadosObject(RadosStore *_st, const rgw_obj_key& _k, Bucket* _b) : Object(_k, _b), store(_st), - acls() { + acls(), + rados_ctx(new RGWObjectCtx(dynamic_cast(store))) , + rados_ctx_owned(true) { + } + RadosObject(RadosObject& _o) : Object(_o) { + store = _o.store; + acls = _o.acls; + manifest = _o.manifest; + rados_ctx = _o.rados_ctx; + rados_ctx_owned = false; } - RadosObject(RadosObject& _o) = default; virtual ~RadosObject(); - virtual int delete_object(const DoutPrefixProvider* dpp, RGWObjectCtx* obj_ctx, + virtual int delete_object(const DoutPrefixProvider* dpp, optional_yield y, bool prevent_versioning) override; virtual int delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astate, Completions* aio, bool keep_index_consistent, optional_yield y) override; - virtual int copy_object(RGWObjectCtx& obj_ctx, User* user, + virtual int copy_object(User* user, req_info* info, const rgw_zone_id& source_zone, rgw::sal::Object* dest_object, rgw::sal::Bucket* dest_bucket, rgw::sal::Bucket* src_bucket, @@ -164,15 +333,24 @@ class RadosObject : public Object { 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(RGWObjectCtx* rctx) const override; - virtual void set_prefetch_data(RGWObjectCtx* rctx) override; - virtual void set_compressed(RGWObjectCtx* rctx) override; - - virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, RGWObjState **state, optional_yield y, bool follow_olh = true) override; - virtual int set_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, Attrs* setattrs, Attrs* delattrs, optional_yield y, rgw_obj* target_obj = NULL) override; - virtual int get_obj_attrs(RGWObjectCtx* rctx, optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; - virtual int modify_obj_attrs(RGWObjectCtx* rctx, const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; - virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, RGWObjectCtx* rctx, const char* attr_name, optional_yield y) override; + virtual void set_atomic() override { + rados_ctx->set_atomic(state.obj); + Object::set_atomic(); + } + virtual void set_prefetch_data() override { + rados_ctx->set_prefetch_data(state.obj); + Object::set_prefetch_data(); + } + virtual void set_compressed() override { + rados_ctx->set_compressed(state.obj); + Object::set_compressed(); + } + + virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **state, optional_yield y, bool follow_olh = true) override; + virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs, Attrs* delattrs, optional_yield y) override; + virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override; + virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp) override; + virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name, optional_yield y) override; virtual bool is_expired() override; virtual void gen_rand_obj_instance_name() override; void get_raw_obj(rgw_raw_obj* raw_obj); @@ -180,27 +358,24 @@ class RadosObject : public Object { return std::unique_ptr(new RadosObject(*this)); } virtual MPSerializer* get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name) override; - virtual int transition(RGWObjectCtx& rctx, - Bucket* bucket, + virtual int transition(Bucket* bucket, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, const DoutPrefixProvider* dpp, optional_yield y) override; virtual bool placement_rules_match(rgw_placement_rule& r1, rgw_placement_rule& r2) override; - virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f, RGWObjectCtx* obj_ctx) override; + virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y, Formatter* f) override; /* Swift versioning */ - virtual int swift_versioning_restore(RGWObjectCtx* obj_ctx, - bool& restored, + virtual int swift_versioning_restore(bool& restored, const DoutPrefixProvider* dpp) override; - virtual int swift_versioning_copy(RGWObjectCtx* obj_ctx, - const DoutPrefixProvider* dpp, + virtual int swift_versioning_copy(const DoutPrefixProvider* dpp, optional_yield y) override; /* OPs */ - virtual std::unique_ptr get_read_op(RGWObjectCtx *) override; - virtual std::unique_ptr get_delete_op(RGWObjectCtx*) override; + virtual std::unique_ptr get_read_op() override; + virtual std::unique_ptr get_delete_op() override; /* OMAP */ virtual int omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker, uint64_t count, @@ -221,6 +396,8 @@ class RadosObject : public Object { uint64_t* alignment = nullptr); void get_max_aligned_size(uint64_t size, uint64_t alignment, uint64_t* max_size); void raw_obj_to_obj(const rgw_raw_obj& raw_obj); + RGWObjManifest* get_manifest() { return manifest; } + RGWObjectCtx& get_ctx() { return *rados_ctx; } private: int read_attrs(const DoutPrefixProvider* dpp, RGWRados::Object::Read &read_op, optional_yield y, rgw_obj* target_obj = nullptr); @@ -340,166 +517,6 @@ class RadosBucket : public Bucket { friend class RadosUser; }; -class RadosZone : public Zone { - protected: - RadosStore* store; - public: - RadosZone(RadosStore* _store) : store(_store) {} - ~RadosZone() = default; - - virtual const RGWZoneGroup& get_zonegroup() override; - virtual int get_zonegroup(const std::string& id, RGWZoneGroup& zonegroup) override; - virtual const RGWZoneParams& get_params() override; - virtual const rgw_zone_id& get_id() override; - virtual const RGWRealm& get_realm() override; - virtual const std::string& get_name() const override; - virtual bool is_writeable() override; - virtual bool get_redirect_endpoint(std::string* endpoint) override; - virtual bool has_zonegroup_api(const std::string& api) const override; - virtual const std::string& get_current_period_id() override; -}; - -class RadosStore : public Store { - private: - RGWRados* rados; - RGWUserCtl* user_ctl; - std::string luarocks_path; - RadosZone zone; - - public: - RadosStore() - : rados(nullptr), zone(this) { - } - ~RadosStore() { - delete rados; - } - - virtual const char* get_name() const override { - return "rados"; - } - - virtual std::unique_ptr get_user(const rgw_user& u) override; - virtual std::string get_cluster_id(const DoutPrefixProvider* dpp, optional_yield y) override; - virtual int get_user_by_access_key(const DoutPrefixProvider* dpp, const std::string& key, optional_yield y, std::unique_ptr* user) override; - virtual int get_user_by_email(const DoutPrefixProvider* dpp, const std::string& email, optional_yield y, std::unique_ptr* user) override; - virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const std::string& user_str, optional_yield y, std::unique_ptr* user) override; - virtual std::unique_ptr get_object(const rgw_obj_key& k) override; - virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) override; - virtual int get_bucket(User* u, const RGWBucketInfo& i, std::unique_ptr* bucket) override; - virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const std::string& tenant, const std::string&name, std::unique_ptr* bucket, optional_yield y) override; - virtual bool is_meta_master() override; - virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv, - bufferlist& in_data, JSONParser* jp, req_info& info, - optional_yield y) override; - virtual Zone* get_zone() { return &zone; } - virtual std::string zone_unique_id(uint64_t unique_num) override; - virtual std::string zone_unique_trans_id(const uint64_t unique_num) override; - virtual int cluster_stat(RGWClusterStat& stats) override; - virtual std::unique_ptr get_lifecycle(void) override; - virtual std::unique_ptr get_completions(void) override; - - // op variant - virtual std::unique_ptr get_notification(rgw::sal::Object* obj, rgw::sal::Object* src_obj, struct req_state* s, rgw::notify::EventType event_type, const std::string* object_name=nullptr) override; - - // non-op variant (e.g., rgwlc) - virtual std::unique_ptr get_notification(const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj, RGWObjectCtx* rctx, rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) override; - virtual RGWLC* get_rgwlc(void) override { return rados->get_lc(); } - virtual RGWCoroutinesManagerRegistry* get_cr_registry() override { return rados->get_cr_registry(); } - - virtual int log_usage(const DoutPrefixProvider *dpp, std::map& usage_info) override; - virtual int log_op(const DoutPrefixProvider *dpp, std::string& oid, bufferlist& bl) override; - virtual int register_to_service_map(const DoutPrefixProvider *dpp, const std::string& daemon_type, - const std::map& meta) override; - virtual void get_quota(RGWQuotaInfo& bucket_quota, RGWQuotaInfo& user_quota) override; - virtual void get_ratelimit(RGWRateLimitInfo& bucket_ratelimit, RGWRateLimitInfo& user_ratelimit, RGWRateLimitInfo& anon_ratelimit) override; - virtual int set_buckets_enabled(const DoutPrefixProvider* dpp, std::vector& buckets, bool enabled) override; - virtual uint64_t get_new_req_id() override { return rados->get_new_req_id(); } - virtual int get_sync_policy_handler(const DoutPrefixProvider* dpp, - std::optional zone, - std::optional bucket, - RGWBucketSyncPolicyHandlerRef* phandler, - optional_yield y) override; - virtual RGWDataSyncStatusManager* get_data_sync_manager(const rgw_zone_id& source_zone) override; - virtual void wakeup_meta_sync_shards(std::set& shard_ids) override { rados->wakeup_meta_sync_shards(shard_ids); } - virtual void wakeup_data_sync_shards(const DoutPrefixProvider *dpp, const rgw_zone_id& source_zone, std::map >& shard_ids) override { rados->wakeup_data_sync_shards(dpp, source_zone, shard_ids); } - virtual int clear_usage(const DoutPrefixProvider *dpp) override { return rados->clear_usage(dpp); } - virtual int read_all_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, - uint32_t max_entries, bool* is_truncated, - RGWUsageIter& usage_iter, - std::map& usage) override; - virtual int trim_all_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch) override; - virtual int get_config_key_val(std::string name, bufferlist* bl) override; - virtual int meta_list_keys_init(const DoutPrefixProvider *dpp, const std::string& section, const std::string& marker, void** phandle) override; - virtual int meta_list_keys_next(const DoutPrefixProvider *dpp, void* handle, int max, std::list& keys, bool* truncated) override; - virtual void meta_list_keys_complete(void* handle) override; - virtual std::string meta_get_marker(void* handle) override; - virtual int meta_remove(const DoutPrefixProvider* dpp, std::string& metadata_key, optional_yield y) override; - virtual const RGWSyncModuleInstanceRef& get_sync_module() { return rados->get_sync_module(); } - virtual std::string get_host_id() { return rados->host_id; } - virtual std::unique_ptr get_lua_script_manager() override; - virtual std::unique_ptr get_role(std::string name, - std::string tenant, - std::string path="", - std::string trust_policy="", - std::string max_session_duration_str="", - std::multimap tags={}) override; - virtual std::unique_ptr get_role(std::string id) override; - virtual int get_roles(const DoutPrefixProvider *dpp, - optional_yield y, - const std::string& path_prefix, - const std::string& tenant, - std::vector>& roles) override; - virtual std::unique_ptr get_oidc_provider() override; - virtual int get_oidc_providers(const DoutPrefixProvider *dpp, - const std::string& tenant, - std::vector>& providers) override; - virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, - optional_yield y, - std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, - const rgw_placement_rule *ptail_placement_rule, - const std::string& unique_tag, - uint64_t position, - uint64_t *cur_accounted_size) override; - virtual std::unique_ptr get_atomic_writer(const DoutPrefixProvider *dpp, - optional_yield y, - std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, - const rgw_placement_rule *ptail_placement_rule, - uint64_t olh_epoch, - const std::string& unique_tag) override; - - virtual void finalize(void) override; - - virtual CephContext* ctx(void) override { return rados->ctx(); } - - virtual const std::string& get_luarocks_path() const override { - return luarocks_path; - } - - virtual void set_luarocks_path(const std::string& path) override { - luarocks_path = path; - } - - /* Unique to RadosStore */ - int get_obj_head_ioctx(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, - librados::IoCtx* ioctx); - int delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj); - int delete_raw_obj_aio(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, Completions* aio); - void get_raw_obj(const rgw_placement_rule& placement_rule, const rgw_obj& obj, rgw_raw_obj* raw_obj); - int get_raw_chunk_size(const DoutPrefixProvider* dpp, const rgw_raw_obj& obj, uint64_t* chunk_size); - - void setRados(RGWRados * st) { rados = st; } - RGWRados* getRados(void) { return rados; } - - RGWServices* svc() { return &rados->svc; } - const RGWServices* svc() const { return &rados->svc; } - RGWCtl* ctl() { return &rados->ctl; } - const RGWCtl* ctl() const { return &rados->ctl; } - - void setUserCtl(RGWUserCtl *_ctl) { user_ctl = _ctl; } -}; - class RadosMultipartPart : public MultipartPart { protected: RGWUploadPartInfo info; @@ -541,13 +558,12 @@ public: virtual const ACLOwner& get_owner() const override { return owner; } virtual ceph::real_time& get_mtime() override { return mtime; } virtual std::unique_ptr get_meta_obj() override; - virtual int init(const DoutPrefixProvider* dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; + virtual int init(const DoutPrefixProvider* dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override; virtual int list_parts(const DoutPrefixProvider* dpp, CephContext* cct, int num_parts, int marker, int* next_marker, bool* truncated, bool assume_unsorted = false) override; - virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, - RGWObjectCtx* obj_ctx) override; + virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct) override; virtual int complete(const DoutPrefixProvider* dpp, optional_yield y, CephContext* cct, std::map& part_etags, @@ -556,13 +572,12 @@ public: RGWCompressionInfo& cs_info, off_t& ofs, std::string& tag, ACLOwner& owner, uint64_t olh_epoch, - rgw::sal::Object* target_obj, - RGWObjectCtx* obj_ctx) override; - virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; + rgw::sal::Object* target_obj) override; + virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; virtual std::unique_ptr get_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) override; @@ -626,8 +641,8 @@ class RadosNotification : public Notification { RadosNotification(const DoutPrefixProvider* _dpp, RadosStore* _store, Object* _obj, Object* _src_obj, req_state* _s, rgw::notify::EventType _type, const std::string* object_name=nullptr) : Notification(_obj, _src_obj, _type), store(_store), res(_dpp, _store, _s, _obj, _src_obj, object_name) { } - RadosNotification(const DoutPrefixProvider* _dpp, RadosStore* _store, Object* _obj, Object* _src_obj, RGWObjectCtx* rctx, rgw::notify::EventType _type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) : - Notification(_obj, _src_obj, _type), store(_store), res(_dpp, _store, rctx, _obj, _src_obj, _bucket, _user_id, _user_tenant, _req_id, y) {} + RadosNotification(const DoutPrefixProvider* _dpp, RadosStore* _store, Object* _obj, Object* _src_obj, rgw::notify::EventType _type, rgw::sal::Bucket* _bucket, std::string& _user_id, std::string& _user_tenant, std::string& _req_id, optional_yield y) : + Notification(_obj, _src_obj, _type), store(_store), res(_dpp, _store, _obj, _src_obj, _bucket, _user_id, _user_tenant, _req_id, y) {} ~RadosNotification() = default; @@ -644,6 +659,7 @@ class RadosAtomicWriter : public Writer { protected: rgw::sal::RadosStore* store; std::unique_ptr aio; + RGWObjectCtx* obj_ctx; rgw::putobj::AtomicObjectProcessor processor; public: @@ -651,15 +667,17 @@ public: optional_yield y, std::unique_ptr _head_obj, RadosStore* _store, std::unique_ptr _aio, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t olh_epoch, const std::string& unique_tag) : Writer(dpp, y), store(_store), aio(std::move(_aio)), + obj_ctx(&dynamic_cast(_head_obj.get())->get_ctx()), processor(&*aio, store, - ptail_placement_rule, owner, obj_ctx, + ptail_placement_rule, owner, + *obj_ctx, std::move(_head_obj), olh_epoch, unique_tag, dpp, y) {} @@ -686,6 +704,7 @@ class RadosAppendWriter : public Writer { protected: rgw::sal::RadosStore* store; std::unique_ptr aio; + RGWObjectCtx* obj_ctx; rgw::putobj::AppendObjectProcessor processor; public: @@ -693,18 +712,20 @@ public: optional_yield y, std::unique_ptr _head_obj, RadosStore* _store, std::unique_ptr _aio, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, const std::string& unique_tag, uint64_t position, uint64_t *cur_accounted_size) : - Writer(dpp, y), - store(_store), - aio(std::move(_aio)), - processor(&*aio, store, - ptail_placement_rule, owner, obj_ctx, - std::move(_head_obj), unique_tag, position, - cur_accounted_size, dpp, y) + Writer(dpp, y), + store(_store), + aio(std::move(_aio)), + obj_ctx(&dynamic_cast(_head_obj.get())->get_ctx()), + processor(&*aio, store, + ptail_placement_rule, owner, + *obj_ctx, + std::move(_head_obj), unique_tag, position, + cur_accounted_size, dpp, y) {} ~RadosAppendWriter() = default; @@ -729,6 +750,7 @@ class RadosMultipartWriter : public Writer { protected: rgw::sal::RadosStore* store; std::unique_ptr aio; + RGWObjectCtx* obj_ctx; rgw::putobj::MultipartObjectProcessor processor; public: @@ -736,16 +758,18 @@ public: optional_yield y, MultipartUpload* upload, std::unique_ptr _head_obj, RadosStore* _store, std::unique_ptr _aio, - const rgw_user& owner, RGWObjectCtx& obj_ctx, + const rgw_user& owner, const rgw_placement_rule *ptail_placement_rule, uint64_t part_num, const std::string& part_num_str) : - Writer(dpp, y), - store(_store), - aio(std::move(_aio)), - processor(&*aio, store, - ptail_placement_rule, owner, obj_ctx, - std::move(_head_obj), upload->get_upload_id(), - part_num, part_num_str, dpp, y) + Writer(dpp, y), + store(_store), + aio(std::move(_aio)), + obj_ctx(&dynamic_cast(_head_obj.get())->get_ctx()), + processor(&*aio, store, + ptail_placement_rule, owner, + *obj_ctx, + std::move(_head_obj), upload->get_upload_id(), + part_num, part_num_str, dpp, y) {} ~RadosMultipartWriter() = default; diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc index ed0f872108ef..b817a1eccb30 100644 --- a/src/rgw/rgw_tools.cc +++ b/src/rgw/rgw_tools.cc @@ -471,7 +471,6 @@ int RGWDataAccess::Object::put(bufferlist& data, rgw::BlockingAioThrottle aio(store->ctx()->_conf->rgw_put_obj_min_window_size); - RGWObjectCtx obj_ctx(store); std::unique_ptr b; store->get_bucket(NULL, bucket_info, &b); std::unique_ptr obj = b->get_object(key); @@ -482,7 +481,7 @@ int RGWDataAccess::Object::put(bufferlist& data, std::unique_ptr processor; processor = store->get_atomic_writer(dpp, y, std::move(obj), - owner.get_id(), obj_ctx, + owner.get_id(), nullptr, olh_epoch, req_id); int ret = processor->prepare(y); diff --git a/src/rgw/store/dbstore/common/dbstore.cc b/src/rgw/store/dbstore/common/dbstore.cc index 0350d5658888..262b978c4bfd 100644 --- a/src/rgw/store/dbstore/common/dbstore.cc +++ b/src/rgw/store/dbstore/common/dbstore.cc @@ -1247,20 +1247,6 @@ int DB::Object::get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, b return get_obj_state(dpp, bucket_info, obj, follow_olh, pstate); } -int DB::Object::get_manifest(const DoutPrefixProvider *dpp, RGWObjManifest **pmanifest) -{ - RGWObjState base_state; - RGWObjState *astate = &base_state; - int r = get_state(dpp, &astate, true); - if (r < 0) { - return r; - } - - *pmanifest = &(*astate->manifest); - - return 0; -} - int DB::Object::Read::get_attr(const DoutPrefixProvider *dpp, const char *name, bufferlist& dest) { RGWObjState base_state; diff --git a/src/rgw/store/dbstore/common/dbstore.h b/src/rgw/store/dbstore/common/dbstore.h index 4ef758e14d2f..698291bad5d6 100644 --- a/src/rgw/store/dbstore/common/dbstore.h +++ b/src/rgw/store/dbstore/common/dbstore.h @@ -1751,13 +1751,11 @@ class DB { bool bs_initialized; public: - Object(DB *_store, const RGWBucketInfo& _bucket_info, RGWObjectCtx& _ctx, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), + Object(DB *_store, const RGWBucketInfo& _bucket_info, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), obj(_obj), state(NULL), versioning_disabled(false), bs_initialized(false) {} - Object(DB *_store, const RGWBucketInfo& _bucket_info, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), obj(_obj) {} - Object(DB *_store, const RGWBucketInfo& _bucket_info, const rgw_obj& _obj, const std::string& _obj_id) : store(_store), bucket_info(_bucket_info), obj(_obj), obj_id(_obj_id) {} struct Read { @@ -1892,7 +1890,6 @@ class DB { const rgw_obj& olh_obj, rgw_obj *target); int get_state(const DoutPrefixProvider *dpp, RGWObjState **pstate, bool follow_olh); - int get_manifest(const DoutPrefixProvider *dpp, RGWObjManifest **pmanifest); DB *get_store() { return store; } rgw_obj& get_obj() { return obj; }