From e99146e2710bc7897f4537f3aee33e3d26296f2c Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Tue, 11 Aug 2020 09:33:02 -0400 Subject: [PATCH] Zipper - Make s->user a unique_ptr Signed-off-by: Daniel Gryniewicz --- src/rgw/librgw.cc | 3 +- src/rgw/rgw_common.cc | 5 +- src/rgw/rgw_common.h | 6 +- src/rgw/rgw_file.cc | 91 ++++++++++----------- src/rgw/rgw_file.h | 118 ++++++++-------------------- src/rgw/rgw_lib.h | 19 ++--- src/rgw/rgw_op.cc | 58 +++++++------- src/rgw/rgw_process.cc | 7 +- src/rgw/rgw_rest_bucket.cc | 4 +- src/rgw/rgw_rest_user.cc | 16 ++-- src/rgw/rgw_rest_user_policy.cc | 4 +- src/rgw/rgw_sal.h | 19 +++++ src/test/librgw_file_nfsns.cc | 6 +- src/test/rgw/test_rgw_iam_policy.cc | 5 +- 14 files changed, 161 insertions(+), 200 deletions(-) diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index bb2a2a0c234e6..b23bb62db674a 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -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; diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 4b8b3e0282a71..9c49e0708b6ef 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -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(); diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 5a358b2747806..3c97553ed7073 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1640,7 +1640,7 @@ struct req_state : DoutPrefixProvider { bool has_bad_meta{false}; - rgw::sal::RGWUser* user{nullptr}; + std::unique_ptr 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 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& u) { user.swap(u); } bool is_err() const { return err.is_err(); } // implements DoutPrefixProvider diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 3c36aca55840f..442096d1e2dde 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -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 "/" (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(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(rgw_fs->rgw); RGWLibFS *fs = static_cast(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); diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index 0dcb3e7646bad..2984d5094f2a9 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -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 _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 _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 _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 _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 _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 _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 _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 _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 _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 attrs; RGWLibFS::BucketStats& bs; - RGWStatBucketRequest(CephContext* _cct, rgw::sal::RGWUser* _user, + RGWStatBucketRequest(CephContext* _cct, std::unique_ptr _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 _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 _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 _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 _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 _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; } diff --git a/src/rgw/rgw_lib.h b/src/rgw/rgw_lib.h index bf1af58754099..1ddd372dc7123 100644 --- a/src/rgw/rgw_lib.h +++ b/src/rgw/rgw_lib.h @@ -127,21 +127,20 @@ namespace rgw { class RGWLibRequest : public RGWRequest, public RGWHandler_Lib { + private: + std::unique_ptr tuser; // Don't use this. It's empty except during init. public: CephContext* cct; - rgw::sal::RGWUser* user; boost::optional 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 _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 _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); diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 69cc5f1e54316..29a556853d963 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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 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 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 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; diff --git a/src/rgw/rgw_process.cc b/src/rgw/rgw_process.cc index 99395fc9f8d14..07aad9b978543 100644 --- a/src/rgw/rgw_process.cc +++ b/src/rgw/rgw_process.cc @@ -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 u = store->get_user(rgw_user()); + s->set_user(u); + RGWObjectCtx rados_ctx(store, s); s->obj_ctx = &rados_ctx; diff --git a/src/rgw/rgw_rest_bucket.cc b/src/rgw/rgw_rest_bucket.cc index 6b0433f3b5484..9db34154563ff 100644 --- a/src/rgw/rgw_rest_bucket.cc +++ b/src/rgw/rgw_rest_bucket.cc @@ -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; diff --git a/src/rgw/rgw_rest_user.cc b/src/rgw/rgw_rest_user.cc index 64865b3408402..d6d490bc3b1db 100644 --- a/src/rgw/rgw_rest_user.cc +++ b/src/rgw/rgw_rest_user.cc @@ -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; diff --git a/src/rgw/rgw_rest_user_policy.cc b/src/rgw/rgw_rest_user_policy.cc index e3c261439a5e4..0926db984b53d 100644 --- a/src/rgw/rgw_rest_user_policy.cc +++ b/src/rgw/rgw_rest_user_policy.cc @@ -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 diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index e09ddb62fee14..a0e7b914ea098 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -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 << ""; + else + out << u->info.user_id; + return out; + } + + friend inline ostream& operator<<(ostream& out, const std::unique_ptr& p) { + out << p.get(); + return out; + } + }; class RGWBucket { diff --git a/src/test/librgw_file_nfsns.cc b/src/test/librgw_file_nfsns.cc index 92153fbdbbda5..ecc3198c0213d 100644 --- a/src/test/librgw_file_nfsns.cc +++ b/src/test/librgw_file_nfsns.cc @@ -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); diff --git a/src/test/rgw/test_rgw_iam_policy.cc b/src/test/rgw/test_rgw_iam_policy.cc index cf512cae93ad9..0970540eb197f 100644 --- a/src/test/rgw/test_rgw_iam_policy.cc +++ b/src/test/rgw/test_rgw_iam_policy.cc @@ -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 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()); -- 2.39.5