]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Zipper - Make s->user a unique_ptr
authorDaniel Gryniewicz <dang@redhat.com>
Tue, 11 Aug 2020 13:33:02 +0000 (09:33 -0400)
committerDaniel Gryniewicz <dang@redhat.com>
Tue, 8 Sep 2020 15:51:29 +0000 (11:51 -0400)
Signed-off-by: Daniel Gryniewicz <dang@redhat.com>
14 files changed:
src/rgw/librgw.cc
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_file.cc
src/rgw/rgw_file.h
src/rgw/rgw_lib.h
src/rgw/rgw_op.cc
src/rgw/rgw_process.cc
src/rgw/rgw_rest_bucket.cc
src/rgw/rgw_rest_user.cc
src/rgw/rgw_rest_user_policy.cc
src/rgw/rgw_sal.h
src/test/librgw_file_nfsns.cc
src/test/rgw/test_rgw_iam_policy.cc

index bb2a2a0c234e6d1612e07a0d5336ac3f7e406f70..b23bb62db674a9852de374d74b10e7d693585736 100644 (file)
@@ -227,8 +227,7 @@ namespace rgw {
     rgw_env.set("HTTP_HOST", "");
 
     /* XXX and -then- bloat up req_state with string copies from it */
-    struct req_state rstate(req->cct, &rgw_env, req->get_user(), req->id);
-    struct req_state *s = &rstate;
+    struct req_state *s = req->get_state();
 
     // XXX fix this
     s->cio = io;
index 4b8b3e0282a71990f2f6373b9a9f4ab9e277293e..9c49e0708b6ef9b05777cfa22665e9615866a4a3 100644 (file)
@@ -262,9 +262,8 @@ void req_info::rebuild_from(req_info& src)
 }
 
 
-req_state::req_state(CephContext* _cct, RGWEnv* e, rgw::sal::RGWUser* u, uint64_t id)
-  : cct(_cct), user(u),
-    info(_cct, e), id(id)
+req_state::req_state(CephContext* _cct, RGWEnv* e, uint64_t id)
+  : cct(_cct), info(_cct, e), id(id)
 {
   enable_ops_log = e->get_enable_ops_log();
   enable_usage_log = e->get_enable_usage_log();
index 5a358b2747806c7b17681185aca2449f538a716b..3c97553ed707368e06593912fb9d5f70fa1ed5d5 100644 (file)
@@ -1640,7 +1640,7 @@ struct req_state : DoutPrefixProvider {
 
   bool has_bad_meta{false};
 
-  rgw::sal::RGWUser* user{nullptr};
+  std::unique_ptr<rgw::sal::RGWUser> user;
 
   struct {
     /* TODO(rzarzynski): switch out to the static_ptr for both members. */
@@ -1726,9 +1726,11 @@ struct req_state : DoutPrefixProvider {
   //token claims from STS token for ops log (can be used for Keystone token also)
   std::vector<string> token_claims;
 
-  req_state(CephContext* _cct, RGWEnv* e, rgw::sal::RGWUser* u, uint64_t id);
+  req_state(CephContext* _cct, RGWEnv* e, uint64_t id);
   ~req_state();
 
+
+  void set_user(std::unique_ptr<rgw::sal::RGWUser>& u) { user.swap(u); }
   bool is_err() const { return err.is_err(); }
 
   // implements DoutPrefixProvider
index 3c36aca55840f7730d05f4a9cb5dc709da3d1f04..442096d1e2dde93b76415b30ff59b843a14c1f5a 100644 (file)
@@ -75,8 +75,7 @@ namespace rgw {
   {
     LookupFHResult fhr{nullptr, 0};
     std::string bucket_name{path};
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWStatBucketRequest req(cct, &ruser, bucket_name, bs);
+    RGWStatBucketRequest req(cct, rgwlib.get_store()->get_user(user.user_id), bucket_name, bs);
 
     int rc = rgwlib.get_fe()->execute_req(&req);
     if ((rc == 0) &&
@@ -162,7 +161,6 @@ namespace rgw {
      * object locator w/o trailing slash */
 
     std::string obj_path = parent->format_child_name(path, false);
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
 
     for (auto ix : { 0, 1, 2 }) {
       switch (ix) {
@@ -172,7 +170,7 @@ namespace rgw {
        if (type == RGW_FS_TYPE_DIRECTORY)
          continue;
 
-       RGWStatObjRequest req(cct, &ruser,
+       RGWStatObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
                              parent->bucket_name(), obj_path,
                              RGWStatObjRequest::FLAG_NONE);
        int rc = rgwlib.get_fe()->execute_req(&req);
@@ -208,7 +206,7 @@ namespace rgw {
          continue;
 
        obj_path += "/";
-       RGWStatObjRequest req(cct, &ruser,
+       RGWStatObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
                              parent->bucket_name(), obj_path,
                              RGWStatObjRequest::FLAG_NONE);
        int rc = rgwlib.get_fe()->execute_req(&req);
@@ -239,7 +237,8 @@ namespace rgw {
       case 2:
       {
        std::string object_name{path};
-       RGWStatLeafRequest req(cct, &ruser, parent, object_name);
+       RGWStatLeafRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                              parent, object_name);
        int rc = rgwlib.get_fe()->execute_req(&req);
        if ((rc == 0) &&
            (req.get_ret() == 0)) {
@@ -291,9 +290,8 @@ namespace rgw {
     if (rgw_fh->deleted())
       return -ESTALE;
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWReadRequest req(get_context(), &ruser, rgw_fh, offset, length,
-                      buffer);
+    RGWReadRequest req(get_context(), rgwlib.get_store()->get_user(user.user_id),
+                      rgw_fh, offset, length, buffer);
 
     int rc = rgwlib.get_fe()->execute_req(&req);
     if ((rc == 0) &&
@@ -315,9 +313,8 @@ namespace rgw {
     if (rgw_fh->deleted())
       return -ESTALE;
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWReadRequest req(get_context(), &ruser, rgw_fh, offset, length,
-                       buffer);
+    RGWReadRequest req(get_context(), rgwlib.get_store()->get_user(user.user_id),
+                      rgw_fh, offset, length, buffer);
 
     int rc = rgwlib.get_fe()->execute_req(&req);
     if ((rc == 0) &&
@@ -348,7 +345,6 @@ namespace rgw {
       /* LOCKED */
     }
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
     if (parent->is_root()) {
       /* a bucket may have an object storing Unix attributes, check
        * for and delete it */
@@ -375,14 +371,15 @@ namespace rgw {
       } else {
        /* delete object w/key "<bucket>/" (uxattrs), if any */
        string oname{"/"};
-       RGWDeleteObjRequest req(cct, &ruser, bkt_fh->bucket_name(), oname);
+       RGWDeleteObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                               bkt_fh->bucket_name(), oname);
        rc = rgwlib.get_fe()->execute_req(&req);
        /* don't care if ENOENT */
        unref(bkt_fh);
       }
 
       string bname{name};
-      RGWDeleteBucketRequest req(cct, &ruser, bname);
+      RGWDeleteBucketRequest req(cct, rgwlib.get_store()->get_user(user.user_id), bname);
       rc = rgwlib.get_fe()->execute_req(&req);
       if (! rc) {
        rc = req.get_ret();
@@ -418,7 +415,7 @@ namespace rgw {
        }
        oname += "/";
       }
-      RGWDeleteObjRequest req(cct, &ruser, parent->bucket_name(),
+      RGWDeleteObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id), parent->bucket_name(),
                              oname);
       rc = rgwlib.get_fe()->execute_req(&req);
       if (! rc) {
@@ -452,8 +449,6 @@ namespace rgw {
     /* XXX initial implementation: try-copy, and delete if copy
      * succeeds */
     int rc = -EINVAL;
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-
     real_time t;
 
     std::string src_name{_src_name};
@@ -498,8 +493,8 @@ namespace rgw {
       switch (ix) {
       case 0:
       {
-       RGWCopyObjRequest req(cct, &ruser, src_fh, dst_fh, src_name,
-                             dst_name);
+       RGWCopyObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                             src_fh, dst_fh, src_name, dst_name);
        int rc = rgwlib.get_fe()->execute_req(&req);
        if ((rc != 0) ||
            ((rc = req.get_ret()) != 0)) {
@@ -570,7 +565,6 @@ namespace rgw {
   {
     int rc, rc2;
     rgw_file_handle *lfh;
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
 
     rc = rgw_lookup(get_fs(), parent->get_fh(), name, &lfh,
                    nullptr /* st */, 0 /* mask */,
@@ -620,7 +614,8 @@ namespace rgw {
        return mkr;
       }
 
-      RGWCreateBucketRequest req(get_context(), &ruser, bname);
+      RGWCreateBucketRequest req(get_context(),
+                                rgwlib.get_store()->get_user(user.user_id), bname);
 
       /* save attrs */
       req.emplace_attr(RGW_ATTR_UNIX_KEY1, std::move(ux_key));
@@ -646,8 +641,8 @@ namespace rgw {
        return mkr;
       }
 
-      RGWPutObjRequest req(get_context(), &ruser, parent->bucket_name(),
-                         dir_name, bl);
+      RGWPutObjRequest req(get_context(), rgwlib.get_store()->get_user(user.user_id),
+                          parent->bucket_name(), dir_name, bl);
 
       /* save attrs */
       req.emplace_attr(RGW_ATTR_UNIX_KEY1, std::move(ux_key));
@@ -705,8 +700,8 @@ namespace rgw {
 
     /* create it */
     buffer::list bl;
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWPutObjRequest req(cct, &ruser, parent->bucket_name(), obj_name, bl);
+    RGWPutObjRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                        parent->bucket_name(), obj_name, bl);
     MkObjResult mkr{nullptr, -EINVAL};
 
     rc = rgwlib.get_fe()->execute_req(&req);
@@ -816,9 +811,8 @@ namespace rgw {
       buffer::copy(link_path, strlen(link_path)));
 #endif
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWPutObjRequest req(get_context(), &ruser, parent->bucket_name(),
-                         obj_name, bl);
+    RGWPutObjRequest req(get_context(), rgwlib.get_store()->get_user(user.user_id),
+                        parent->bucket_name(), obj_name, bl);
 
     /* save attrs */
     req.emplace_attr(RGW_ATTR_UNIX_KEY1, std::move(ux_key));
@@ -892,8 +886,8 @@ namespace rgw {
       obj_name += "/";
     }
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWSetAttrsRequest req(cct, &ruser, rgw_fh->bucket_name(), obj_name);
+    RGWSetAttrsRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                          rgw_fh->bucket_name(), obj_name);
 
     rgw_fh->create_stat(st, mask);
     rgw_fh->encode_attrs(ux_key, ux_attrs);
@@ -910,7 +904,7 @@ namespace rgw {
     if (rc == -ENOENT) {
       /* special case:  materialize placeholder dir */
       buffer::list bl;
-      RGWPutObjRequest req(get_context(), &ruser, rgw_fh->bucket_name(),
+      RGWPutObjRequest req(get_context(), rgwlib.get_store()->get_user(user.user_id), rgw_fh->bucket_name(),
                           obj_name, bl);
 
       rgw_fh->encode_attrs(ux_key, ux_attrs); /* because std::moved */
@@ -949,8 +943,8 @@ namespace rgw {
       << " update old versioned fh : " << obj_name
       << dendl;
 
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), user);
-    RGWSetAttrsRequest req(cct, &ruser, rgw_fh->bucket_name(), obj_name);
+    RGWSetAttrsRequest req(cct, rgwlib.get_store()->get_user(user.user_id),
+                          rgw_fh->bucket_name(), obj_name);
 
     rgw_fh->encode_attrs(ux_key, ux_attrs);
 
@@ -1228,11 +1222,12 @@ namespace rgw {
 
   bool RGWFileHandle::has_children() const
   {
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs->get_user());
     if (unlikely(! is_dir()))
       return false;
 
-    RGWRMdirCheck req(fs->get_context(), &ruser, this);
+    RGWRMdirCheck req(fs->get_context(),
+                     rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                     this);
     int rc = rgwlib.get_fe()->execute_req(&req);
     if (! rc) {
       return req.valid && req.has_children;
@@ -1263,7 +1258,6 @@ namespace rgw {
     int rc = 0;
     struct timespec now;
     CephContext* cct = fs->get_context();
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs->get_user());
 
     lsubdout(cct, rgw, 10)
       << __func__ << " readdir called on "
@@ -1288,8 +1282,8 @@ namespace rgw {
     }
 
     if (is_root()) {
-      RGWListBucketsRequest req(cct, &ruser, this, rcb, cb_arg,
-                               offset);
+      RGWListBucketsRequest req(cct, rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                               this, rcb, cb_arg, offset);
       rc = rgwlib.get_fe()->execute_req(&req);
       if (! rc) {
        (void) clock_gettime(CLOCK_MONOTONIC_COARSE, &now); /* !LOCKED */
@@ -1301,7 +1295,8 @@ namespace rgw {
        *eof = req.eof();
       }
     } else {
-      RGWReaddirRequest req(cct, &ruser, this, rcb, cb_arg, offset);
+      RGWReaddirRequest req(cct, rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                           this, rcb, cb_arg, offset);
       rc = rgwlib.get_fe()->execute_req(&req);
       if (! rc) {
        (void) clock_gettime(CLOCK_MONOTONIC_COARSE, &now); /* !LOCKED */
@@ -1331,7 +1326,6 @@ namespace rgw {
   {
     using std::get;
     using WriteCompletion = RGWLibFS::WriteCompletion;
-    rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs->get_user());
 
     lock_guard guard(mtx);
 
@@ -1370,8 +1364,9 @@ namespace rgw {
       /* start */
       std::string object_name = relative_object_name();
       f->write_req =
-       new RGWWriteRequest(rgwlib.get_store(), &ruser, this,
-                           bucket_name(), object_name);
+       new RGWWriteRequest(rgwlib.get_store(),
+                           rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                           this, bucket_name(), object_name);
       rc = rgwlib.get_fe()->start_req(f->write_req);
       if (rc < 0) {
        lsubdout(fs->get_context(), rgw, 5)
@@ -1840,9 +1835,10 @@ int rgw_statfs(struct rgw_fs *rgw_fs,
 {
   RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
   struct rados_cluster_stat_t stats;
-  rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs->get_user());
 
-  RGWGetClusterStatReq req(fs->get_context(), &ruser, stats);
+  RGWGetClusterStatReq req(fs->get_context(),
+                          rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                          stats);
   int rc = rgwlib.get_fe()->execute_req(&req);
   if (rc < 0) {
     lderr(fs->get_context()) << "ERROR: getting total cluster usage"
@@ -2392,7 +2388,6 @@ int rgw_writev(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
   CephContext* cct = static_cast<CephContext*>(rgw_fs->rgw);
   RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
   RGWFileHandle* rgw_fh = get_rgwfh(fh);
-  rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs->get_user());
 
   if (! rgw_fh->is_file())
     return -EINVAL;
@@ -2406,8 +2401,8 @@ int rgw_writev(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
   }
 
   std::string oname = rgw_fh->relative_object_name();
-  RGWPutObjRequest req(cct, &ruser, rgw_fh->bucket_name(),
-                      oname, bl);
+  RGWPutObjRequest req(cct, rgwlib.get_store()->get_user(fs->get_user()->user_id),
+                      rgw_fh->bucket_name(), oname, bl);
 
   int rc = rgwlib.get_fe()->execute_req(&req);
 
index 0dcb3e7646bad1f4fc436e622d7947281c7ddd0b..2984d5094f2a90be76e9ebeb68861f1b2098e7ac 100644 (file)
@@ -1317,10 +1317,10 @@ public:
   uint32_t d_count;
   bool rcb_eof; // caller forced early stop in readdir cycle
 
-  RGWListBucketsRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWListBucketsRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                        RGWFileHandle* _rgw_fh, rgw_readdir_cb _rcb,
                        void* _cb_arg, RGWFileHandle::readdir_offset& _offset)
-    : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset),
+    : RGWLibRequest(_cct, std::move(_user)), rgw_fh(_rgw_fh), offset(_offset),
       cb_arg(_cb_arg), rcb(_rcb), ioff(nullptr), ix(0), d_count(0),
       rcb_eof(false) {
 
@@ -1366,10 +1366,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -1451,10 +1447,10 @@ public:
   uint32_t d_count;
   bool rcb_eof; // caller forced early stop in readdir cycle
 
-  RGWReaddirRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWReaddirRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                    RGWFileHandle* _rgw_fh, rgw_readdir_cb _rcb,
                    void* _cb_arg, RGWFileHandle::readdir_offset& _offset)
-    : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset),
+    : RGWLibRequest(_cct, std::move(_user)), rgw_fh(_rgw_fh), offset(_offset),
       cb_arg(_cb_arg), rcb(_rcb), ioff(nullptr), ix(0), d_count(0),
       rcb_eof(false) {
 
@@ -1507,10 +1503,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     prefix = rgw_fh->relative_object_name();
     if (prefix.length() > 0)
       prefix += "/";
@@ -1682,9 +1674,9 @@ public:
   bool valid;
   bool has_children;
 
-  RGWRMdirCheck (CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWRMdirCheck (CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                 const RGWFileHandle* _rgw_fh)
-    : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), valid(false),
+    : RGWLibRequest(_cct, std::move(_user)), rgw_fh(_rgw_fh), valid(false),
       has_children(false) {
     default_max = 2;
     op = this;
@@ -1715,9 +1707,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     prefix = rgw_fh->relative_object_name();
     if (prefix.length() > 0)
       prefix += "/";
@@ -1764,9 +1753,9 @@ class RGWCreateBucketRequest : public RGWLibRequest,
 public:
   const std::string& bucket_name;
 
-  RGWCreateBucketRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWCreateBucketRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                        std::string& _bname)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname) {
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname) {
     op = this;
   }
 
@@ -1802,10 +1791,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -1833,9 +1818,9 @@ class RGWDeleteBucketRequest : public RGWLibRequest,
 public:
   const std::string& bucket_name;
 
-  RGWDeleteBucketRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWDeleteBucketRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                        std::string& _bname)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname) {
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname) {
     op = this;
   }
 
@@ -1866,10 +1851,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -1889,10 +1870,10 @@ public:
   buffer::list& bl; /* XXX */
   size_t bytes_written;
 
-  RGWPutObjRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWPutObjRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                  const std::string& _bname, const std::string& _oname,
                  buffer::list& _bl)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname),
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname), obj_name(_oname),
       bl(_bl), bytes_written(0) {
     op = this;
   }
@@ -1932,10 +1913,6 @@ public:
     /* XXX required in RGWOp::execute() */
     s->content_length = bl.length();
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -1985,10 +1962,10 @@ public:
   size_t read_resid; /* initialize to len, <= sizeof(ulp_buffer) */
   bool do_hexdump = false;
 
-  RGWReadRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWReadRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                 RGWFileHandle* _rgw_fh, uint64_t off, uint64_t len,
                 void *_ulp_buffer)
-    : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), ulp_buffer(_ulp_buffer),
+    : RGWLibRequest(_cct, std::move(_user)), rgw_fh(_rgw_fh), ulp_buffer(_ulp_buffer),
       nread(0), read_resid(len) {
     op = this;
 
@@ -2027,10 +2004,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2080,9 +2053,9 @@ public:
   const std::string& bucket_name;
   const std::string& obj_name;
 
-  RGWDeleteObjRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWDeleteObjRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                      const std::string& _bname, const std::string& _oname)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname) {
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname), obj_name(_oname) {
     op = this;
   }
 
@@ -2113,10 +2086,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2135,10 +2104,10 @@ public:
 
   static constexpr uint32_t FLAG_NONE = 0x000;
 
-  RGWStatObjRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWStatObjRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                    const std::string& _bname, const std::string& _oname,
                    uint32_t _flags)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname),
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname), obj_name(_oname),
       _size(0), flags(_flags) {
     op = this;
 
@@ -2194,10 +2163,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2232,10 +2197,10 @@ public:
   std::map<std::string, buffer::list> attrs;
   RGWLibFS::BucketStats& bs;
 
-  RGWStatBucketRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWStatBucketRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                       const std::string& _path,
                       RGWLibFS::BucketStats& _stats)
-    : RGWLibRequest(_cct, _user), bs(_stats) {
+    : RGWLibRequest(_cct, std::move(_user)), bs(_stats) {
     uri = "/" + _path;
     op = this;
   }
@@ -2275,10 +2240,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2311,9 +2272,9 @@ public:
   bool is_dir;
   bool exact_matched;
 
-  RGWStatLeafRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWStatLeafRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                     RGWFileHandle* _rgw_fh, const std::string& _path)
-    : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), path(_path),
+    : RGWLibRequest(_cct, std::move(_user)), rgw_fh(_rgw_fh), path(_path),
       matched(false), is_dir(false), exact_matched(false) {
     default_max = 1000; // logical max {"foo", "foo/"}
     op = this;
@@ -2346,10 +2307,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     prefix = rgw_fh->relative_object_name();
     if (prefix.length() > 0)
       prefix += "/";
@@ -2429,9 +2386,9 @@ public:
   size_t bytes_written;
   bool eio;
 
-  RGWWriteRequest(rgw::sal::RGWRadosStore* store, rgw::sal::RGWUser* _user, RGWFileHandle* _fh,
-                 const std::string& _bname, const std::string& _oname)
-    : RGWLibContinuedReq(store->ctx(), _user),
+  RGWWriteRequest(rgw::sal::RGWRadosStore* store, std::unique_ptr<rgw::sal::RGWUser> _user,
+                 RGWFileHandle* _fh, const std::string& _bname, const std::string& _oname)
+    : RGWLibContinuedReq(store->ctx(), std::move(_user)),
       bucket_name(_bname), obj_name(_oname),
       rgw_fh(_fh), filter(nullptr), real_ofs(0),
       bytes_written(0), eio(false) {
@@ -2470,10 +2427,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2526,10 +2479,10 @@ public:
   const std::string& src_name;
   const std::string& dst_name;
 
-  RGWCopyObjRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWCopyObjRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                    RGWFileHandle* _src_parent, RGWFileHandle* _dst_parent,
                    const std::string& _src_name, const std::string& _dst_name)
-    : RGWLibRequest(_cct, _user), src_parent(_src_parent),
+    : RGWLibRequest(_cct, std::move(_user)), src_parent(_src_parent),
       dst_parent(_dst_parent), src_name(_src_name), dst_name(_dst_name) {
     /* all requests have this */
     op = this;
@@ -2587,10 +2540,6 @@ public:
     s->info.domain = ""; /* XXX ? */
 #endif
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2615,9 +2564,9 @@ public:
   const std::string& bucket_name;
   const std::string& obj_name;
 
-  RGWSetAttrsRequest(CephContext* _cct, rgw::sal::RGWUser* _user,
+  RGWSetAttrsRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                     const std::string& _bname, const std::string& _oname)
-    : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname) {
+    : RGWLibRequest(_cct, std::move(_user)), bucket_name(_bname), obj_name(_oname) {
     op = this;
   }
 
@@ -2648,10 +2597,6 @@ public:
     s->info.request_params = "";
     s->info.domain = ""; /* XXX ? */
 
-    // woo
-    s->user = user;
-    s->bucket_tenant = user->get_tenant();
-
     return 0;
   }
 
@@ -2670,9 +2615,9 @@ class RGWGetClusterStatReq : public RGWLibRequest,
         public RGWGetClusterStat {
 public:
   struct rados_cluster_stat_t& stats_req;
-  RGWGetClusterStatReq(CephContext* _cct,rgw::sal::RGWUser* _user,
+  RGWGetClusterStatReq(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user,
                        rados_cluster_stat_t& _stats):
-  RGWLibRequest(_cct, _user), stats_req(_stats){
+  RGWLibRequest(_cct, std::move(_user)), stats_req(_stats){
     op = this;
   }
 
@@ -2691,7 +2636,6 @@ public:
     struct req_state* s = get_state();
     s->info.method = "GET";
     s->op = OP_GET;
-    s->user = user;
     return 0;
   }
 
index bf1af58754099cca2b809fbaf270fc30a2ea9f6d..1ddd372dc7123958898303ca736319ff7996523c 100644 (file)
@@ -127,21 +127,20 @@ namespace rgw {
 
   class RGWLibRequest : public RGWRequest,
                        public RGWHandler_Lib {
+  private:
+    std::unique_ptr<rgw::sal::RGWUser> tuser; // Don't use this.  It's empty except during init.
   public:
     CephContext* cct;
-    rgw::sal::RGWUser* user;
     boost::optional<RGWSysObjectCtx> sysobj_ctx;
 
     /* unambiguiously return req_state */
     inline struct req_state* get_state() { return this->RGWRequest::s; }
 
-    RGWLibRequest(CephContext* _cct, rgw::sal::RGWUser* _user)
-      :  RGWRequest(rgwlib.get_store()->getRados()->get_new_req_id()), cct(_cct),
-        user(_user)
+    RGWLibRequest(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user)
+      :  RGWRequest(rgwlib.get_store()->getRados()->get_new_req_id()),
+        tuser(std::move(_user)), cct(_cct)
       {}
 
-    rgw::sal::RGWUser* get_user() { return user; }
-
   int postauth_init() override { return 0; }
 
     /* descendant equivalent of *REST*::init_from_header(...):
@@ -168,6 +167,8 @@ namespace rgw {
       get_state()->sysobj_ctx = &(sysobj_ctx.get());
       get_state()->req_id = store->svc()->zone_utils->unique_id(id);
       get_state()->trans_id = store->svc()->zone_utils->unique_trans_id(id);
+      get_state()->bucket_tenant = tuser->get_tenant();
+      get_state()->set_user(tuser);
 
       ldpp_dout(_s, 2) << "initializing for trans_id = "
          << get_state()->trans_id.c_str() << dendl;
@@ -191,9 +192,9 @@ namespace rgw {
     RGWObjectCtx rados_ctx;
   public:
 
-    RGWLibContinuedReq(CephContext* _cct, rgw::sal::RGWUser* _user)
-      :  RGWLibRequest(_cct, _user), io_ctx(),
-        rstate(_cct, &io_ctx.get_env(), _user, id),
+    RGWLibContinuedReq(CephContext* _cct, std::unique_ptr<rgw::sal::RGWUser> _user)
+      :  RGWLibRequest(_cct, std::move(_user)), io_ctx(),
+        rstate(_cct, &io_ctx.get_env(), id),
         rados_ctx(rgwlib.get_store(), &rstate)
       {
        io_ctx.init(_cct);
index 69cc5f1e54316c7ae41c4d0a3bfebe8ee998084e..29a556853d9635bd128bde9a3171607f624e8d1c 100644 (file)
@@ -559,7 +559,7 @@ int rgw_build_bucket_policies(rgw::sal::RGWRadosStore* store, struct req_state*
   if (!s->bucket_name.empty()) {
     s->bucket_exists = true;
 
-    ret = store->get_bucket(s->user, rgw_bucket(rgw_bucket_key(s->bucket_tenant, s->bucket_name, s->bucket_instance_id)), &s->bucket);
+    ret = store->get_bucket(s->user.get(), rgw_bucket(rgw_bucket_key(s->bucket_tenant, s->bucket_name, s->bucket_instance_id)), &s->bucket);
     if (ret < 0) {
       if (ret != -ENOENT) {
        string bucket_log;
@@ -1129,7 +1129,7 @@ void RGWPutBucketTags::execute() {
   if (op_ret < 0) 
     return;
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
   }
@@ -1155,7 +1155,7 @@ int RGWDeleteBucketTags::verify_permission()
 void RGWDeleteBucketTags::execute()
 {
   bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -1203,7 +1203,7 @@ void RGWPutBucketReplication::execute() {
   if (op_ret < 0) 
     return;
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -1241,7 +1241,7 @@ int RGWDeleteBucketReplication::verify_permission()
 void RGWDeleteBucketReplication::execute()
 {
   bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -1307,7 +1307,7 @@ int RGWOp::init_quota()
   rgw::sal::RGWUser* user;
 
   if (s->user->get_id() == s->bucket_owner.get_id()) {
-    user = s->user;
+    user = s->user.get();
   } else {
     int r = owner_user.load_by_id(s->yield);
     if (r < 0)
@@ -1807,7 +1807,7 @@ int RGWGetObj::handle_user_manifest(const char *prefix)
 
   if (bucket_name.compare(s->bucket->get_name()) != 0) {
     map<string, bufferlist> bucket_attrs;
-    r = store->get_bucket(s->user, s->user->get_tenant(), bucket_name, &ubucket);
+    r = store->get_bucket(s->user.get(), s->user->get_tenant(), bucket_name, &ubucket);
     if (r < 0) {
       ldpp_dout(this, 0) << "could not get bucket info for bucket="
                       << bucket_name << dendl;
@@ -1936,7 +1936,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl)
 
        std::unique_ptr<rgw::sal::RGWBucket> tmp_bucket;
         auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-       int r = store->get_bucket(s->user, s->user->get_tenant(), bucket_name, &tmp_bucket);
+       int r = store->get_bucket(s->user.get(), s->user->get_tenant(), bucket_name, &tmp_bucket);
         if (r < 0) {
           ldpp_dout(this, 0) << "could not get bucket info for bucket="
                           << bucket_name << dendl;
@@ -2579,7 +2579,7 @@ void RGWSetBucketVersioning::execute()
     }
   }
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -2655,7 +2655,7 @@ void RGWSetBucketWebsite::execute()
   if (op_ret < 0)
     return;
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << " forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -2689,7 +2689,7 @@ void RGWDeleteBucketWebsite::execute()
 {
   bufferlist in_data;
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "NOTICE: forward_to_master failed on bucket=" << s->bucket->get_name()
       << "returned err=" << op_ret << dendl;
@@ -2730,7 +2730,7 @@ void RGWStatBucket::execute()
     return;
   }
 
-  op_ret = store->get_bucket(s->user, s->bucket->get_key(), &bucket);
+  op_ret = store->get_bucket(s->user.get(), s->bucket->get_key(), &bucket);
   if (op_ret) {
     return;
   }
@@ -3088,7 +3088,7 @@ void RGWCreateBucket::execute()
 
   /* we need to make sure we read bucket info, it's not read before for this
    * specific request */
-  op_ret = store->get_bucket(s->user, s->bucket_tenant, s->bucket_name, &s->bucket);
+  op_ret = store->get_bucket(s->user.get(), s->bucket_tenant, s->bucket_name, &s->bucket);
   if (op_ret < 0 && op_ret != -ENOENT)
     return;
   s->bucket_exists = (op_ret != -ENOENT);
@@ -3213,7 +3213,7 @@ void RGWCreateBucket::execute()
       op_ret = s->bucket->get_bucket_info(s->yield);
       if (op_ret < 0) {
         return;
-      } else if (!s->bucket->is_owner(s->user)) {
+      } else if (!s->bucket->is_owner(s->user.get())) {
         /* New bucket doesn't belong to the account we're operating on. */
         op_ret = -EEXIST;
         return;
@@ -3314,7 +3314,7 @@ void RGWDeleteBucket::execute()
   }
 
   bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user, &ot.read_version, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), &ot.read_version, in_data, nullptr, s->info);
   if (op_ret < 0) {
     if (op_ret == -ENOENT) {
       /* adjust error, we want to return with NoSuchBucket and not
@@ -4934,7 +4934,7 @@ int RGWCopyObj::verify_permission()
   }
 
   /* This is a bit of a hack; create an empty bucket, then load it below. */
-  op_ret = store->get_bucket(s->user, RGWBucketInfo(), &src_bucket);
+  op_ret = store->get_bucket(s->user.get(), RGWBucketInfo(), &src_bucket);
   if (op_ret < 0) {
     if (op_ret == -ENOENT) {
       op_ret = -ERR_NO_SUCH_BUCKET;
@@ -5005,7 +5005,7 @@ int RGWCopyObj::verify_permission()
                                                            or intra region sync */
     dest_bucket = src_bucket->clone();
   } else {
-    op_ret = store->get_bucket(s->user, RGWBucketInfo(), &dest_bucket);
+    op_ret = store->get_bucket(s->user.get(), RGWBucketInfo(), &dest_bucket);
     if (op_ret < 0) {
       if (op_ret == -ENOENT) {
        op_ret = -ERR_NO_SUCH_BUCKET;
@@ -5181,7 +5181,7 @@ void RGWCopyObj::execute()
   }
 
   op_ret = src_object->copy_object(obj_ctx,
-          s->user,
+          s->user.get(),
           &s->info,
           source_zone,
           dest_object.get(),
@@ -5423,7 +5423,7 @@ void RGWPutACLs::execute()
     if (s->canned_acl.empty()) {
       in_data.append(data);
     }
-    op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+    op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
     if (op_ret < 0) {
       ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
       return;
@@ -5550,7 +5550,7 @@ void RGWPutLC::execute()
     ldpp_dout(this, 15) << "New LifecycleConfiguration:" << ss.str() << dendl;
   }
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -5566,7 +5566,7 @@ void RGWPutLC::execute()
 void RGWDeleteLC::execute()
 {
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -5610,7 +5610,7 @@ void RGWPutCORS::execute()
   if (op_ret < 0)
     return;
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -5632,7 +5632,7 @@ int RGWDeleteCORS::verify_permission()
 void RGWDeleteCORS::execute()
 {
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -5742,7 +5742,7 @@ void RGWSetRequestPayment::pre_exec()
 void RGWSetRequestPayment::execute()
 {
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -6607,7 +6607,7 @@ bool RGWBulkDelete::Deleter::delete_single(const acct_path_t& path)
   ACLOwner bowner;
   RGWObjVersionTracker ot;
 
-  int ret = store->get_bucket(s->user, s->user->get_tenant(), path.bucket_name, &bucket);
+  int ret = store->get_bucket(s->user.get(), s->user->get_tenant(), path.bucket_name, &bucket);
   if (ret < 0) {
     goto binfo_fail;
   }
@@ -6997,7 +6997,7 @@ int RGWBulkUploadOp::handle_file(const std::string_view path,
   std::unique_ptr<rgw::sal::RGWBucket> bucket;
   ACLOwner bowner;
 
-  op_ret = store->get_bucket(s->user, rgw_bucket(rgw_bucket_key(s->user->get_tenant(), bucket_name)), &bucket);
+  op_ret = store->get_bucket(s->user.get(), rgw_bucket(rgw_bucket_key(s->user->get_tenant(), bucket_name)), &bucket);
   if (op_ret == -ENOENT) {
     ldpp_dout(this, 20) << "non existent directory=" << bucket_name << dendl;
   } else if (op_ret < 0) {
@@ -7511,7 +7511,7 @@ void RGWPutBucketPolicy::execute()
     return;
   }
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 20) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -7655,7 +7655,7 @@ void RGWPutBucketObjectLock::execute()
     return;
   }
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldout(s->cct, 20) << __func__ << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -7974,7 +7974,7 @@ void RGWPutBucketPublicAccessBlock::execute()
     return;
   }
 
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
index 99395fc9f8d144705003b36da8c273b681008592..07aad9b9785436f3810bdde2e61b1b9261c5c3fa 100644 (file)
@@ -188,11 +188,12 @@ int process_request(rgw::sal::RGWRadosStore* const store,
 
   RGWEnv& rgw_env = client_io->get_env();
 
-  rgw::sal::RGWRadosUser user(store);
-
-  struct req_state rstate(g_ceph_context, &rgw_env, &user, req->id);
+  struct req_state rstate(g_ceph_context, &rgw_env, req->id);
   struct req_state *s = &rstate;
 
+  std::unique_ptr<rgw::sal::RGWUser> u = store->get_user(rgw_user());
+  s->set_user(u);
+
   RGWObjectCtx rados_ctx(store, s);
   s->obj_ctx = &rados_ctx;
 
index 6b0433f3b5484c482f905ce14f4e4a71d3319fcc..9db34154563ff1a06efd076e14b8b3dd7dae33d2 100644 (file)
@@ -150,7 +150,7 @@ void RGWOp_Bucket_Link::execute()
   op_state.set_new_bucket_name(new_bucket_name);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -188,7 +188,7 @@ void RGWOp_Bucket_Unlink::execute()
   op_state.set_bucket_name(bucket);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
index 64865b3408402e4147c969feb0b62bfa0b9b5b5a..d6d490bc3b1dba38b6730d7912264a606a254e4a 100644 (file)
@@ -225,7 +225,7 @@ void RGWOp_User_Create::execute()
   }
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -367,7 +367,7 @@ void RGWOp_User_Modify::execute()
   }
   
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -408,7 +408,7 @@ void RGWOp_User_Remove::execute()
   op_state.set_purge_data(purge_data);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -484,7 +484,7 @@ void RGWOp_Subuser_Create::execute()
   op_state.set_key_type(key_type);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -551,7 +551,7 @@ void RGWOp_Subuser_Modify::execute()
   op_state.set_key_type(key_type);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -594,7 +594,7 @@ void RGWOp_Subuser_Remove::execute()
     op_state.set_purge_keys();
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -735,7 +735,7 @@ void RGWOp_Caps_Add::execute()
   op_state.set_caps(caps);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -773,7 +773,7 @@ void RGWOp_Caps_Remove::execute()
   op_state.set_caps(caps);
 
   bufferlist data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
     return;
index e3c261439a5e4c0e9e998161c8ef39e223d964df..0926db984b53ded11c895913eabe9f0d1b014627 100644 (file)
@@ -134,7 +134,7 @@ void RGWPutUserPolicy::execute()
   }
 
   ceph::bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "ERROR: forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -338,7 +338,7 @@ void RGWDeleteUserPolicy::execute()
   }
 
   ceph::bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user, nullptr, in_data, nullptr, s->info);
+  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info);
   if (op_ret < 0) {
     // a policy might've been uploaded to this site when there was no sync
     // req. in earlier releases, proceed deletion
index e09ddb62fee144d3597c9b62c78565d81c8f1604..a0e7b914ea098bc974c1fd3a76dfb2281546ea0d 100644 (file)
@@ -133,6 +133,25 @@ class RGWUser {
     /* dang temporary; will be removed when User is complete */
     rgw_user& get_user() { return info.user_id; }
     RGWUserInfo& get_info() { return info; }
+
+    friend inline ostream& operator<<(ostream& out, const RGWUser& u) {
+      out << u.info.user_id;
+      return out;
+    }
+
+    friend inline ostream& operator<<(ostream& out, const RGWUser* u) {
+      if (!u)
+       out << "<NULL>";
+      else
+       out << u->info.user_id;
+      return out;
+    }
+
+    friend inline ostream& operator<<(ostream& out, const std::unique_ptr<RGWUser>& p) {
+      out << p.get();
+      return out;
+    }
+
 };
 
 class RGWBucket {
index 92153fbdbbda5932d83b4e487eb9cde3dd912276..ecc3198c0213d397c711e6d3d585d4adf72bfe6f 100644 (file)
@@ -241,9 +241,9 @@ TEST(LibRGW, SETUP_HIER1)
          std::cout << "creating: " << bucket_name << ":" << obj_name
                    << std::endl;
        }
-       rgw::sal::RGWRadosUser ruser(rgwlib.get_store(), *fs_private->get_user());
-       RGWPutObjRequest req(cct, &ruser, bucket_name, obj_name,
-                           bl);
+       RGWPutObjRequest req(cct,
+                            rgwlib.get_store()->get_user(fs_private->get_user()->user_id),
+                            bucket_name, obj_name, bl);
        int rc = rgwlib.get_fe()->execute_req(&req);
        int rc2 = req.get_ret();
        ASSERT_EQ(rc, 0);
index cf512cae93ad9acd002e09787235d56520d0f502..0970540eb197f96c469afd31740beec17808a356 100644 (file)
@@ -911,10 +911,11 @@ TEST_F(IPPolicyTest, IPEnvironment) {
   // Unfortunately RGWCivetWeb is too tightly tied to civetweb to test RGWCivetWeb::init_env.
   RGWEnv rgw_env;
   rgw::sal::RGWRadosStore store;
-  rgw::sal::RGWRadosUser user(&store);
+  std::unique_ptr<rgw::sal::RGWUser> user = store.get_user(rgw_user());
   rgw_env.set("REMOTE_ADDR", "192.168.1.1");
   rgw_env.set("HTTP_HOST", "1.2.3.4");
-  req_state rgw_req_state(cct.get(), &rgw_env, &user, 0);
+  req_state rgw_req_state(cct.get(), &rgw_env, 0);
+  rgw_req_state.set_user(user);
   rgw_build_iam_environment(&store, &rgw_req_state);
   auto ip = rgw_req_state.env.find("aws:SourceIp");
   ASSERT_NE(ip, rgw_req_state.env.end());