]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW - Zipper - remove RGWObjectCtx from SAL API 44616/head
authorDaniel Gryniewicz <dang@redhat.com>
Tue, 28 Sep 2021 16:12:15 +0000 (12:12 -0400)
committerDaniel Gryniewicz <dang@redhat.com>
Mon, 7 Mar 2022 15:53:03 +0000 (10:53 -0500)
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 <dang@fprintf.net>
37 files changed:
src/rgw/librgw.cc
src/rgw/rgw_admin.cc
src/rgw/rgw_bucket.cc
src/rgw/rgw_common.h
src/rgw/rgw_cr_rados.cc
src/rgw/rgw_cr_rados.h
src/rgw/rgw_file.cc
src/rgw/rgw_file.h
src/rgw/rgw_lc.cc
src/rgw/rgw_lc_tier.cc
src/rgw/rgw_lc_tier.h
src/rgw/rgw_lib.h
src/rgw/rgw_notify.cc
src/rgw/rgw_notify.h
src/rgw/rgw_obj_manifest.h
src/rgw/rgw_object_expirer_core.cc
src/rgw/rgw_op.cc
src/rgw/rgw_orphan.cc
src/rgw/rgw_process.cc
src/rgw/rgw_pubsub.cc
src/rgw/rgw_putobj_processor.cc
src/rgw/rgw_putobj_processor.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_sal.cc
src/rgw/rgw_sal.h
src/rgw/rgw_sal_dbstore.cc
src/rgw/rgw_sal_dbstore.h
src/rgw/rgw_sal_motr.cc
src/rgw/rgw_sal_motr.h
src/rgw/rgw_sal_rados.cc
src/rgw/rgw_sal_rados.h
src/rgw/rgw_tools.cc
src/rgw/store/dbstore/common/dbstore.cc
src/rgw/store/dbstore/common/dbstore.h

index 18c4140e60b31d6ada5113eb4e7f642b920eab80..4ec71216398b8acd97d8c1def34538b45fc14c03 100644 (file)
@@ -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);
index 3ea1119e0ff807b18db40b1384d47384266e7810..d4984f25440682f68aeb8cf0566f42dddf087fda 100644 (file)
@@ -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<rgw::sal::Object::ReadOp> read_op = obj->get_read_op(&obj_ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<uint64_t, vector<rgw_bucket_olh_log_entry> > log;
     bool is_truncated;
 
-    RGWObjectCtx rctx(store);
     std::unique_ptr<rgw::sal::Object> 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<rgw::sal::Object> 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;
index 12772f1ea28bcc0a71556fec28c9d9e76c60a711..2bccf186e1862635b27018ae13b62ca31422ddb7 100644 (file)
@@ -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<rgw::sal::Object> 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<rgw::sal::Object::ReadOp> rop = obj->get_read_op(&obj_ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object> 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<string, bufferlist> 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;
index 67a11f430bc0dc89c5c987fa126e6d88fe4e5594..57e9aa575b785148711f9e7d722cd4011dca3d24 100644 (file)
@@ -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);
index 7af1f5a7fec2dbc67370e8db1550dd998ccf9625..55a8791c038a70bccc848ed455f361bdd19e70b1 100644 (file)
@@ -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<rgw::sal::Object::DeleteOp> 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;
   }
index 23ee4a6a9d08f279b5ce2a22210caff252cad5ec..5d1b1edca72b7b6397b1da011ca481d218be5cae 100644 (file)
@@ -1168,9 +1168,9 @@ class RGWAsyncRemoveObj : public RGWAsyncRadosRequest {
   rgw::sal::RadosStore* store;
   rgw_zone_id source_zone;
 
-  RGWBucketInfo bucket_info;
+  std::unique_ptr<rgw::sal::Bucket> bucket;
+  std::unique_ptr<rgw::sal::Object> 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);
   }
 };
 
index 6fa4e817155ccfbf872f2077ed41aa2f2c7fd9ad..d705c402005f4b044e6db1ffdcdf96fea4d2aa94 100644 (file)
@@ -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);
index be3adc75754ed21c378570a4da20334a31d5059c..d1c19ab0a5005c696a9c91f1623da74e12045e77 100644 (file)
@@ -1376,11 +1376,8 @@ public:
 
   int op_init() override {
     // assign store, s, and dialect_handler
-    RGWObjectCtx* rados_ctx
-      = static_cast<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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<RGWObjectCtx*>(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;
   }
index 4570689eea8e3c9815d09f4727d4149cf5847b46..81df1d9fb02ae8ba602d0bca4f823f841f270824 100644 (file)
@@ -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<rgw::sal::Object::ReadOp> read_op = obj->get_read_op(&ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object::DeleteOp> 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<rgw::sal::Notification> 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<std::string&>(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<rgw::sal::MultipartUpload> 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<rgw::sal::Object::ReadOp> rop = obj->get_read_op(&ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object::ReadOp> read_op(oc.obj->get_read_op(&oc.rctx));
+    std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::RadosStore*>(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 " 
index 704b7dee2e2714fcc4d5d045c937f3eee2ace011..82cd913e99331e8aa4480f037367d0c96de8ac74 100644 (file)
@@ -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<RGWLCStreamRead> 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<RGWLCCloudStreamPut> 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<RGWLCStreamRead> 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<RGWLCCloudStreamPut> 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();
 
index 86df479e8280847c23414253ce19cddd12892312..ed0e826509ac9739c7e9fcc61a394c5a8ce499c4 100644 (file)
@@ -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) {}
 };
 
index 0c5e9e721685f42755c9dfcc3bb70f386ce0914f..4f3bd0205cce07e74a420d0b1008e194ae6f22b8 100644 (file)
@@ -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<rgw::sal::User> _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;
index 57c028479b4b7383f5858cd172371f31776aec34..aa02cf85aac164bda6621eda009ca22afc78ae0d 100644 (file)
@@ -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),
index 44e16f751efbf69a294fd513574c17e98870cb93..88c85340b9754e693e4ed32b5ed84cd3f19cbb7a 100644 (file)
@@ -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,
index a3d82a66808b8da0a763db77a0ac580e8d5cc96c..0c285e977842ccde9d9425e8a15db36e3b16ca70 100644 (file)
@@ -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<RGWObjManifest> 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<std::string, bufferlist> attrset;
-
-  RGWObjState();
-  RGWObjState(const RGWObjState& rhs);
-  ~RGWObjState();
-
-  bool get_attr(std::string name, bufferlist& dest) {
-    std::map<std::string, bufferlist>::iterator iter = attrset.find(name);
-    if (iter != attrset.end()) {
-      dest = iter->second;
-      return true;
-    }
-    return false;
-  }
-};
index 370001bff993999c816a2081a8feb9d53f5c8a8d..45a2feff2e45a706daac0d790ea84ee9d21f4800 100644 (file)
@@ -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<rgw::sal::Object> 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;
 }
index 89dbe92a2c8c0a97b28e21e6861635e6b6bea41f..aba72b261f74d3d771e49783627f514e76ad0934 100644 (file)
@@ -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<string, bufferlist>& 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<rgw::sal::Object::ReadOp> rop = obj->get_read_op(&obj_ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<RGWObjectCtx *>(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<RGWAccessControlPolicy>(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<rgw::sal::Object> 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<rgw::sal::Object::ReadOp> read_op = part->get_read_op(&obj_ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object::ReadOp> read_op(s->object->get_read_op(s->obj_ctx));
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object> 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<rgw::sal::Object> obj = bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id));
-  std::unique_ptr<rgw::sal::Object::ReadOp> read_op(obj->get_read_op(s->obj_ctx));
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<RGWObjectCtx*>(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<rgw::sal::MultipartUpload> 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<rgw::sal::Writer> 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<RGWObjectCtx *>(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<rgw::sal::Object::DeleteOp> del_op = s->object->get_delete_op(obj_ctx);
+      std::unique_ptr<rgw::sal::Object::DeleteOp> 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<RGWObjectCtx *>(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<string, bufferlist> 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<string,bufferlist> attrs = s->bucket_attrs;
     attrs[RGW_ATTR_ACL] = bl;
@@ -6190,7 +6184,7 @@ void RGWInitMultipart::execute(optional_yield y)
   std::unique_ptr<rgw::sal::MultipartUpload> 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<RGWObjectCtx *>(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<string, bufferlist>::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<rgw_obj_key>::iterator iter;
   RGWMultiDelXMLParser parser;
-  RGWObjectCtx *obj_ctx = static_cast<RGWObjectCtx *>(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<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op(obj_ctx);
+    std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op();
     del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status();
     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<rgw::sal::Object> obj = bucket->get_object(path.obj_key);
-    obj->set_atomic(s->obj_ctx);
+    obj->set_atomic();
 
-    std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op(s->obj_ctx);
+    std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = obj->get_delete_op();
     del_op->params.versioning_status = obj->get_bucket()->get_info().versioning_status();
     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<RGWObjectCtx *>(s->obj_ctx);
   std::unique_ptr<rgw::sal::Bucket> bucket;
   ACLOwner bowner;
 
@@ -7423,7 +7413,7 @@ int RGWBulkUploadOp::handle_file(const std::string_view path,
 
   std::unique_ptr<rgw::sal::Writer> 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<string, bufferlist> 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;
index 874061306b6580f90a59186c3dcd9a3e2ffd9d0f..6c942df80136e151bc95604da7a8a7c56c726970 100644 (file)
@@ -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<rgw::sal::Object> 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<rgw::sal::Bucket> 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<rgw::sal::Object> 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();
index f8d43a3258d225ee735018bb5ee11168a504ff8f..77ef102d30c1d3f0afe01256d35737ca2a8a3ee8 100644 (file)
@@ -290,9 +290,6 @@ int process_request(rgw::sal::Store* const store,
   std::unique_ptr<rgw::sal::User> 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);
index 67b9fa41446c08537e2449a24a6b74d9a0bc75df..50073eeaff5b3b4fa19c61fb3cac194d4aa1efe6 100644 (file)
@@ -936,28 +936,24 @@ int RGWPubSub::SubWithEvents<EventType>::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<rgw::sal::Bucket> 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<rgw::sal::Object> 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<rgw::sal::Object::DeleteOp> 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;
   }
index 80d39794c83018bcc37912d4f43f63c91e8f5d85..8da8d2564d437a3dfe3ed32999cd525cff600034 100644 (file)
@@ -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<rgw::sal::RadosObject*>(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);
index 5aa4d62339871446172457d8917002e0dd938add..1beb9a724c05219f774a510b9fe427f9ed5e9277 100644 (file)
@@ -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<rgw::sal::Object> _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) {
index 6cc26a99bd9ff0f3fb6d2e64457a7396e882f270..755df18354c29782c4385d6adc70b3d97e48e298 100644 (file)
@@ -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<rgw_obj, RGWObjState>::iterator iter;
+RGWObjStateManifest *RGWObjectCtx::get_state(const rgw_obj& obj) {
+  RGWObjStateManifest *result;
+  typename std::map<rgw_obj, RGWObjStateManifest>::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<rgw::sal::Bucket> bucket;
+  store->get_bucket(nullptr, bucket_info, &bucket);
+  std::unique_ptr<rgw::sal::Object> 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<string, bufferlist> 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<RGWObjectCtx *>(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<rgw::sal::Object> 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<rgw::sal::Bucket> bucket;
+  store->get_bucket(nullptr, bucket_info, &bucket);
+  std::unique_ptr<rgw::sal::Object> 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<rgw::sal::Object::DeleteOp> 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<string, bufferlist>& 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<rgw::sal::Bucket> bucket;
+  store->get_bucket(nullptr, bucket_info, &bucket);
+  std::unique_ptr<rgw::sal::Object> 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<ceph_subsys_rgw, 20>() && \
-       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<rgw::sal::RadosObject*>(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<string, bufferlist> 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<string, bufferlist>& attrs,
                         map<string, bufferlist>* rmattrs,
                         optional_yield y)
 {
-  rgw_obj obj = src_obj;
-  if (obj.key.instance == "null") {
-    obj.key.instance.clear();
+  std::unique_ptr<rgw::sal::Object> 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<RGWObjectCtx *>(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<string, bufferlist>::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<rgw::sal::Object> 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<uint64_t, std::vector<rgw_bucket_olh_log_entry> >& 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<cls_rgw_obj_key>::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<rgw::sal::Object> 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<uint64_t, vector<rgw_bucket_olh_log_entry> > 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<rgw::sal::Object> 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<rgw::sal::Object> 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<string, bufferlist> 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<rgw::sal::Bucket> 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<rgw::sal::Object> 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 \"" <<
index 7ec229fee18d91afa77e07c08f31a1b5be4b8ae4..1fd06d5b55fb1eabae95d50502d9b9bc01fea77d 100644 (file)
@@ -184,25 +184,29 @@ public:
              const rgw_placement_rule **prule) override;
 };
 
+struct RGWObjStateManifest {
+  RGWObjState state;
+  std::optional<RGWObjManifest> manifest;
+};
+
 class RGWObjectCtx {
   rgw::sal::Store* store;
   ceph::shared_mutex lock = ceph::make_shared_mutex("RGWObjectCtx");
-  void *s{nullptr};
 
-  std::map<rgw_obj, RGWObjState> objs_state;
+  std::map<rgw_obj, RGWObjStateManifest> 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<std::string, bufferlist> *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<std::string, bufferlist>& 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<RGWObjManifest> manifest;
+       std::optional<RGWObjManifest> manifest;
         uint64_t size{0};
        struct timespec mtime {};
         std::map<std::string, bufferlist> 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<std::string, bufferlist>& attrs,
                         std::map<std::string, bufferlist>* 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<uint64_t, std::vector<rgw_bucket_olh_log_entry> > *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<uint64_t, std::vector<rgw_bucket_olh_log_entry> >& 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<std::string, bufferlist>& pending_entries, std::map<std::string, bufferlist> *rm_pending_entries);
   int remove_olh_pending_entries(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& olh_obj, std::map<std::string, bufferlist>& 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<cls_rgw_gc_obj_info>& 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<rgw::sal::Bucket>& optional_bucket);
   int list_lc_progress(std::string& marker, uint32_t max_entries,
index f096a81c6708f65a4fd3afab12d7301d91ff583c..f2bdfa39b0406197e7e7180e46632fad891afc80 100644 (file)
@@ -2586,7 +2586,7 @@ int RGWPutObj_ObjStore_S3::get_encrypt_filter(
                                  multipart_upload_id);
     std::unique_ptr<rgw::sal::Object> 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<BlockCrypt> 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<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(subdir_name));
 
-  RGWObjectCtx& obj_ctx = *static_cast<RGWObjectCtx *>(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) {
index f7a6340a41c273f4f6caf74fd0582add9aa0b73e..c403ab70006b6aaee7d4d3eb308b12291cd1dd13 100644 (file)
@@ -864,14 +864,13 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) {
   std::unique_ptr<rgw::sal::Object> 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<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(std::move(subdir_name)));
 
   /* First, get attrset of the object we'll try to retrieve. */
-  RGWObjectCtx& obj_ctx = *static_cast<RGWObjectCtx *>(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<rgw::sal::Object> obj = s->bucket->get_object(rgw_obj_key(index));
 
-  RGWObjectCtx& obj_ctx = *static_cast<RGWObjectCtx *>(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;
   }
 
index 418368ba39053cbab679dd9fd9d9aff1b00424ac..d08fbcc8713a7e3ca6621b05aa7413c6ac44455f 100644 (file)
@@ -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) {
index 2fc8ab62b9bb7d3ebbaa1d84359be7417f0d668c..4cab98f298bd99a5462af0058d3d59f4f44d8fc3 100644 (file)
 #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<std::string, ceph::buffer::list> 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<Notification> 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<Writer> get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<ReadOp> get_read_op(RGWObjectCtx*) = 0;
+    virtual std::unique_ptr<ReadOp> get_read_op() = 0;
     /** Get a new DeleteOp for this object */
-    virtual std::unique_ptr<DeleteOp> get_delete_op(RGWObjectCtx*) = 0;
+    virtual std::unique_ptr<DeleteOp> 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<rgw::sal::Object> 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<Writer> get_writer(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          std::unique_ptr<rgw::sal::Object> _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;
index bd90098731118c4622dfc625358682f99b72c55b..e7415b9907b9e8f0996f778261a426d7b17c6453 100644 (file)
@@ -565,32 +565,48 @@ namespace rgw::sal {
     return std::make_unique<DBLuaScriptManager>(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<Object::ReadOp> DBObject::get_read_op(RGWObjectCtx* ctx)
+  std::unique_ptr<Object::ReadOp> DBObject::get_read_op()
   {
-    return std::make_unique<DBObject::DBReadOp>(this, ctx);
+    return std::make_unique<DBObject::DBReadOp>(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<Object::DeleteOp> DBObject::get_delete_op(RGWObjectCtx* ctx)
+  std::unique_ptr<Object::DeleteOp> DBObject::get_delete_op()
   {
-    return std::make_unique<DBObject::DBDeleteOp>(this, ctx);
+    return std::make_unique<DBObject::DBDeleteOp>(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<rgw::sal::Object> 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<rgw::sal::Object::DeleteOp> del_op = meta_obj->get_delete_op(obj_ctx);
+    std::unique_ptr<rgw::sal::Object::DeleteOp> 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<rgw::sal::Object::ReadOp> read_op = meta_obj->get_read_op(obj_ctx);
+    std::unique_ptr<rgw::sal::Object::ReadOp> 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<rgw::sal::Object> _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<DBMultipartWriter>(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<rgw::sal::Object> _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<rgw::sal::Object> _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<Writer> DBStore::get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> DBStore::get_atomic_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<DBAtomicWriter>(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<Notification> 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)
index c5b85095041c0b1fab96c3e0091fc27024b1b916..b7451dc91ca4e7e4b5943c623ef0d62949128e04 100644 (file)
@@ -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<rgw::sal::Object> 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<int, std::string>& 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<Writer> get_writer(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          std::unique_ptr<rgw::sal::Object> _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<Object> clone() override {
         return std::unique_ptr<Object>(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<ReadOp> get_read_op(RGWObjectCtx *) override;
-      virtual std::unique_ptr<DeleteOp> get_delete_op(RGWObjectCtx*) override;
+      virtual std::unique_ptr<ReadOp> get_read_op() override;
+      virtual std::unique_ptr<DeleteOp> 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<rgw::sal::Object> _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<rgw::sal::Object> _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<Notification> 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<Writer> get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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;
index 379f91df82a58db83b9c070327014516b7054742..08194edf6379e067c3ca6d967c7b1557cda0c69f 100644 (file)
@@ -893,12 +893,8 @@ std::unique_ptr<LuaScriptManager> MotrStore::get_lua_script_manager()
   return std::make_unique<MotrLuaScriptManager>(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<Object::ReadOp> MotrObject::get_read_op(RGWObjectCtx* ctx)
+std::unique_ptr<Object::ReadOp> MotrObject::get_read_op()
 {
-  return std::make_unique<MotrObject::MotrReadOp>(this, ctx);
+  return std::make_unique<MotrObject::MotrReadOp>(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<Object::DeleteOp> MotrObject::get_delete_op(RGWObjectCtx* ctx)
+std::unique_ptr<Object::DeleteOp> MotrObject::get_delete_op()
 {
-  return std::make_unique<MotrObject::MotrDeleteOp>(this, ctx);
+  return std::make_unique<MotrObject::MotrDeleteOp>(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<rgw::sal::Object> _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<Writer> MotrMultipartUpload::get_writer(
                                  const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<MotrMultipartWriter>(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<MultipartUpload> MotrBucket::get_multipart_upload(const std::str
 std::unique_ptr<Writer> MotrStore::get_append_writer(const DoutPrefixProvider *dpp,
         optional_yield y,
         std::unique_ptr<rgw::sal::Object> _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<Writer> MotrStore::get_append_writer(const DoutPrefixProvider *d
 std::unique_ptr<Writer> MotrStore::get_atomic_writer(const DoutPrefixProvider *dpp,
         optional_yield y,
         std::unique_ptr<rgw::sal::Object> _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<MotrAtomicWriter>(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<Notification> MotrStore::get_notification(Object* obj, Object* s
 }
 
 std::unique_ptr<Notification>  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<MotrNotification>(obj, src_obj, event_type);
index f340f23afab673907cd204d757cce5e3be3afc81..52fa8847722d078461ae26e503b0424922a758d9 100644 (file)
@@ -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<int, std::unique_ptr<MotrObject>> 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<Object> clone() override {
       return std::unique_ptr<Object>(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<ReadOp> get_read_op(RGWObjectCtx *) override;
-    virtual std::unique_ptr<DeleteOp> get_delete_op(RGWObjectCtx*) override;
+    virtual std::unique_ptr<ReadOp> get_read_op() override;
+    virtual std::unique_ptr<DeleteOp> 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<rgw::sal::Object> _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<rgw::sal::Object> _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<rgw::sal::Object> 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<int, std::string>& 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<Writer> get_writer(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          std::unique_ptr<rgw::sal::Object> _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<Notification> 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<Notification> 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<Writer> get_append_writer(const DoutPrefixProvider *dpp,
         optional_yield y,
         std::unique_ptr<rgw::sal::Object> _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<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
         optional_yield y,
         std::unique_ptr<rgw::sal::Object> _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;
index 8c9f9ef031b7da6dc24178d7f3b3e4a215593efa..bf08e8cafa8a4a17eb5cb3c4f3b69302b39b7fea 100644 (file)
@@ -494,9 +494,12 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool
     std::vector<rgw_bucket_dir_entry>::iterator it = results.objs.begin();
     for (; it != results.objs.end(); ++it) {
       RGWObjState *astate = NULL;
+      RGWObjManifest *amanifest = nullptr;
       std::unique_ptr<rgw::sal::Object> 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<rgw::sal::Object> 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<std::unique_ptr<MultipartUpload>> 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<Notification> RadosStore::get_notification(
   return std::make_unique<RadosNotification>(s, this, obj, src_obj, s, event_type, object_name);
 }
 
-std::unique_ptr<Notification> 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<Notification> 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<RadosNotification>(dpp, this, obj, src_obj, rctx, event_type, _bucket, _user_id, _user_tenant, _req_id, y);
+  return std::make_unique<RadosNotification>(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<Writer> RadosStore::get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> RadosStore::get_append_writer(const DoutPrefixProvider *
   auto aio = rgw::make_throttle(ctx()->_conf->rgw_put_obj_min_window_size, y);
   return std::make_unique<RadosAppendWriter>(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<Writer> RadosStore::get_append_writer(const DoutPrefixProvider *
 std::unique_ptr<Writer> RadosStore::get_atomic_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> RadosStore::get_atomic_writer(const DoutPrefixProvider *
   auto aio = rgw::make_throttle(ctx()->_conf->rgw_put_obj_min_window_size, y);
   return std::make_unique<RadosAtomicWriter>(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 = &target;
-
-  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<Object::ReadOp> RadosObject::get_read_op(RGWObjectCtx* ctx)
+std::unique_ptr<Object::ReadOp> RadosObject::get_read_op()
 {
-  return std::make_unique<RadosObject::RadosReadOp>(this, ctx);
+  return std::make_unique<RadosObject::RadosReadOp>(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<RGWObjectCtx *>(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<Object::DeleteOp> RadosObject::get_delete_op(RGWObjectCtx* ctx)
+std::unique_ptr<Object::DeleteOp> RadosObject::get_delete_op()
 {
-  return std::make_unique<RadosObject::RadosDeleteOp>(this, ctx);
+  return std::make_unique<RadosObject::RadosDeleteOp>(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<RGWObjectCtx *>(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<rgw::sal::Object> 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<rgw::sal::Object> 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<rgw::sal::Object::DeleteOp> del_op = meta_obj->get_delete_op(obj_ctx);
+  std::unique_ptr<rgw::sal::Object::DeleteOp> 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<rgw::sal::Object> 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<RadosObject*>(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<rgw::sal::Object::ReadOp> read_op = meta_obj->get_read_op(obj_ctx);
-  meta_obj->set_prefetch_data(obj_ctx);
+  std::unique_ptr<rgw::sal::Object::ReadOp> 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<Writer> RadosMultipartUpload::get_writer(
                                  const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<Writer> RadosMultipartUpload::get_writer(
   auto aio = rgw::make_throttle(store->ctx()->_conf->rgw_put_obj_min_window_size, y);
   return std::make_unique<RadosMultipartWriter>(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) :
index 4e4673c032806dce1026a9e29af5287defe541e5..8d61af2e7fc14fee28964635fee5d709b323d9a2 100644 (file)
@@ -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<User> 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>* user) override;
+    virtual int get_user_by_email(const DoutPrefixProvider* dpp, const std::string& email, optional_yield y, std::unique_ptr<User>* user) override;
+    virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const std::string& user_str, optional_yield y, std::unique_ptr<User>* user) override;
+    virtual std::unique_ptr<Object> 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>* bucket, optional_yield y) override;
+    virtual int get_bucket(User* u, const RGWBucketInfo& i, std::unique_ptr<Bucket>* bucket) override;
+    virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const std::string& tenant, const std::string&name, std::unique_ptr<Bucket>* 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<Lifecycle> get_lifecycle(void) override;
+    virtual std::unique_ptr<Completions> get_completions(void) override;
+    virtual std::unique_ptr<Notification> 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<Notification> 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<rgw_user_bucket, RGWUsageBatch>& 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<std::string, std::string>& 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<rgw_bucket>& 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<rgw_zone_id> zone,
+                                       std::optional<rgw_bucket> 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<int>& 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<int, std::set<std::string> >& 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<rgw_user_bucket, rgw_usage_log_entry>& 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<std::string>& 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<LuaScriptManager> get_lua_script_manager() override;
+    virtual std::unique_ptr<RGWRole> get_role(std::string name,
+                                             std::string tenant,
+                                             std::string path="",
+                                             std::string trust_policy="",
+                                             std::string max_session_duration_str="",
+                std::multimap<std::string,std::string> tags={}) override;
+    virtual std::unique_ptr<RGWRole> 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<std::unique_ptr<RGWRole>>& roles) override;
+    virtual std::unique_ptr<RGWOIDCProvider> get_oidc_provider() override;
+    virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
+                                  const std::string& tenant,
+                                  std::vector<std::unique_ptr<RGWOIDCProvider>>& providers) override;
+    virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
+                                 optional_yield y,
+                                 std::unique_ptr<rgw::sal::Object> _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<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
+                                 optional_yield y,
+                                 std::unique_ptr<rgw::sal::Object> _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*>(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*>(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<Object>(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<ReadOp> get_read_op(RGWObjectCtx *) override;
-    virtual std::unique_ptr<DeleteOp> get_delete_op(RGWObjectCtx*) override;
+    virtual std::unique_ptr<ReadOp> get_read_op() override;
+    virtual std::unique_ptr<DeleteOp> 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<User> 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>* user) override;
-    virtual int get_user_by_email(const DoutPrefixProvider* dpp, const std::string& email, optional_yield y, std::unique_ptr<User>* user) override;
-    virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const std::string& user_str, optional_yield y, std::unique_ptr<User>* user) override;
-    virtual std::unique_ptr<Object> 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>* bucket, optional_yield y) override;
-    virtual int get_bucket(User* u, const RGWBucketInfo& i, std::unique_ptr<Bucket>* bucket) override;
-    virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const std::string& tenant, const std::string&name, std::unique_ptr<Bucket>* 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<Lifecycle> get_lifecycle(void) override;
-    virtual std::unique_ptr<Completions> get_completions(void) override;
-
-    // op variant
-    virtual std::unique_ptr<Notification> 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<Notification> 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<rgw_user_bucket, RGWUsageBatch>& 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<std::string, std::string>& 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<rgw_bucket>& 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<rgw_zone_id> zone,
-                                       std::optional<rgw_bucket> 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<int>& 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<int, std::set<std::string> >& 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<rgw_user_bucket, rgw_usage_log_entry>& 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<std::string>& 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<LuaScriptManager> get_lua_script_manager() override;
-    virtual std::unique_ptr<RGWRole> get_role(std::string name,
-                                             std::string tenant,
-                                             std::string path="",
-                                             std::string trust_policy="",
-                                             std::string max_session_duration_str="",
-                std::multimap<std::string,std::string> tags={}) override;
-    virtual std::unique_ptr<RGWRole> 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<std::unique_ptr<RGWRole>>& roles) override;
-    virtual std::unique_ptr<RGWOIDCProvider> get_oidc_provider() override;
-    virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
-                                  const std::string& tenant,
-                                  std::vector<std::unique_ptr<RGWOIDCProvider>>& providers) override;
-    virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
-                                 optional_yield y,
-                                 std::unique_ptr<rgw::sal::Object> _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<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
-                                 optional_yield y,
-                                 std::unique_ptr<rgw::sal::Object> _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<rgw::sal::Object> 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<int, std::string>& 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<Writer> get_writer(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          std::unique_ptr<rgw::sal::Object> _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> aio;
+  RGWObjectCtx* obj_ctx;
   rgw::putobj::AtomicObjectProcessor processor;
 
 public:
@@ -651,15 +667,17 @@ public:
                    optional_yield y,
                    std::unique_ptr<rgw::sal::Object> _head_obj,
                    RadosStore* _store, std::unique_ptr<Aio> _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<RadosObject*>(_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> aio;
+  RGWObjectCtx* obj_ctx;
   rgw::putobj::AppendObjectProcessor processor;
 
 public:
@@ -693,18 +712,20 @@ public:
                    optional_yield y,
                    std::unique_ptr<rgw::sal::Object> _head_obj,
                    RadosStore* _store, std::unique_ptr<Aio> _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<RadosObject*>(_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> aio;
+  RGWObjectCtx* obj_ctx;
   rgw::putobj::MultipartObjectProcessor processor;
 
 public:
@@ -736,16 +758,18 @@ public:
                       optional_yield y, MultipartUpload* upload,
                       std::unique_ptr<rgw::sal::Object> _head_obj,
                       RadosStore* _store, std::unique_ptr<Aio> _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<RadosObject*>(_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;
 
index ed0f872108ef1ca5db6566e98ef29c36b3396b06..b817a1eccb302e30dea6253e1c634f6e995d0636 100644 (file)
@@ -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<rgw::sal::Bucket> b;
   store->get_bucket(NULL, bucket_info, &b);
   std::unique_ptr<rgw::sal::Object> obj = b->get_object(key);
@@ -482,7 +481,7 @@ int RGWDataAccess::Object::put(bufferlist& data,
 
   std::unique_ptr<rgw::sal::Writer> 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);
index 0350d5658888207c3775b87416576a8f66d0b90e..262b978c4bfd218d21c39d9107cf7b4d5cb913e7 100644 (file)
@@ -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;
index 4ef758e14d2f6c11487f19de2e3336fb00bfe19d..698291bad5d6f1f96b1598a00a91ab25d00d081e 100644 (file)
@@ -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; }