]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW Zipper - move attrs into User
authorDaniel Gryniewicz <dang@redhat.com>
Thu, 25 Mar 2021 17:36:14 +0000 (13:36 -0400)
committerDaniel Gryniewicz <dang@redhat.com>
Wed, 28 Apr 2021 15:07:00 +0000 (11:07 -0400)
Signed-off-by: Daniel Gryniewicz <dang@redhat.com>
13 files changed:
src/rgw/rgw_auth.cc
src/rgw/rgw_file.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_user_policy.cc
src/rgw/rgw_sal.h
src/rgw/rgw_sal_rados.cc
src/rgw/rgw_sal_rados.h
src/rgw/rgw_sts.cc
src/rgw/rgw_user.cc
src/test/rgw/test_rgw_lua.cc

index 75e29bb724c4b91bbcdaae50b56cf2852a737f4b..7b0f68f6a64857081b8e180ce2804f40489681ff 100644 (file)
@@ -376,8 +376,7 @@ void rgw::auth::WebIdentityApplier::create_account(const DoutPrefixProvider* dpp
   rgw_apply_default_bucket_quota(user->get_info().bucket_quota, cct->_conf);
   rgw_apply_default_user_quota(user->get_info().user_quota, cct->_conf);
 
-  int ret = user->store_info(dpp, null_yield,
-                            RGWUserCtl::PutParams().set_exclusive(true));
+  int ret = user->store_info(dpp, null_yield, true);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to store new user info: user="
                   << user << " ret=" << ret << dendl;
@@ -603,8 +602,7 @@ void rgw::auth::RemoteApplier::create_account(const DoutPrefixProvider* dpp,
   rgw_apply_default_user_quota(user->get_info().user_quota, cct->_conf);
   user_info = user->get_info();
 
-  int ret = user->store_info(dpp, null_yield,
-                            RGWUserCtl::PutParams().set_exclusive(true));
+  int ret = user->store_info(dpp, null_yield, true);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to store new user info: user="
                   << user << " ret=" << ret << dendl;
index f58b3bf6e4e7299a64ab54aeb3774c9f12fa76ba..b4d6b65496e903f34b892f89f5f82b67c1cca7ae 100644 (file)
@@ -1005,8 +1005,7 @@ namespace rgw {
        if (token.valid() && (ldh->auth(token.id, token.key) == 0)) {
          /* try to store user if it doesn't already exist */
          if (user->load_by_id(dpp, null_yield) < 0) {
-           int ret = user->store_info(dpp, null_yield, RGWUserCtl::PutParams()
-                                                  .set_exclusive(true));
+           int ret = user->store_info(dpp, null_yield, true);
            if (ret < 0) {
              lsubdout(get_context(), rgw, 10)
                << "NOTICE: failed to store new user's info: ret=" << ret
index e66a5b85719a6788d84e529a145d20f5243e8bef..cc493a2c16c9a3925a1dd74100a724bcb35a9455 100644 (file)
@@ -640,12 +640,11 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Store* st
 
   /* handle user ACL only for those APIs which support it */
   if (s->user_acl) {
-    rgw::sal::Attrs uattrs;
     std::unique_ptr<rgw::sal::User> acl_user = store->get_user(acct_acl_user.uid);
 
-    ret = acl_user->read_attrs(dpp, y, &uattrs);
+    ret = acl_user->read_attrs(dpp, y);
     if (!ret) {
-      ret = get_user_policy_from_attr(s->cct, uattrs, *s->user_acl);
+      ret = get_user_policy_from_attr(s->cct, acl_user->get_attrs(), *s->user_acl);
     }
     if (-ENOENT == ret) {
       /* In already existing clusters users won't have ACL. In such case
@@ -668,10 +667,11 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Store* st
   // hence the check for user type
   if (! s->user->get_id().empty() && s->auth.identity->get_identity_type() != TYPE_ROLE) {
     try {
-      rgw::sal::Attrs uattrs;
-      ret = s->user->read_attrs(dpp, y, &uattrs);
+      ret = s->user->read_attrs(dpp, y);
       if (ret == 0) {
-          auto user_policies = get_iam_user_policy_from_attr(s->cct, uattrs, s->user->get_tenant());
+       auto user_policies = get_iam_user_policy_from_attr(s->cct,
+                                                          s->user->get_attrs(),
+                                                          s->user->get_tenant());
           s->iam_user_policies.insert(s->iam_user_policies.end(),
                                       std::make_move_iterator(user_policies.begin()),
                                       std::make_move_iterator(user_policies.end()));
@@ -2288,7 +2288,7 @@ void RGWListBuckets::execute(optional_yield y)
   }
 
   if (supports_account_metadata()) {
-    op_ret = s->user->read_attrs(this, s->yield, &attrs);
+    op_ret = s->user->read_attrs(this, s->yield);
     if (op_ret < 0) {
       goto send_end;
     }
@@ -4347,10 +4347,11 @@ int RGWPutMetadataAccount::init_processing(optional_yield y)
     return op_ret;
   }
 
-  op_ret = s->user->read_attrs(this, y, &orig_attrs, &acct_op_tracker);
+  op_ret = s->user->read_attrs(this, y);
   if (op_ret < 0) {
     return op_ret;
   }
+  orig_attrs = s->user->get_attrs();
 
   if (has_policy) {
     bufferlist acl_bl;
@@ -4411,7 +4412,6 @@ void RGWPutMetadataAccount::execute(optional_yield y)
   if (op_ret < 0) {
     return;
   }
-  acct_op_tracker = s->user->get_version_tracker();
 
   /* Handle the TempURL-related stuff. */
   if (!temp_url_keys.empty()) {
@@ -4427,10 +4427,8 @@ void RGWPutMetadataAccount::execute(optional_yield y)
 
   /* We are passing here the current (old) user info to allow the function
    * optimize-out some operations. */
-  op_ret = s->user->store_info(this, y, RGWUserCtl::PutParams()
-                            .set_old_info(&s->user->get_info())
-                            .set_objv_tracker(&acct_op_tracker)
-                            .set_attrs(&attrs));
+  s->user->set_attrs(attrs);
+  op_ret = s->user->store_info(this, y, false, &s->user->get_info());
 }
 
 int RGWPutMetadataBucket::verify_permission(optional_yield y)
index 3de1b5d3b34b65ce6922773a915c8ba2e7ef1f1f..229c1f72b332242091d3fcfedc15cda9324318af 100644 (file)
@@ -802,7 +802,6 @@ protected:
   std::string end_marker;
   int64_t limit;
   uint64_t limit_max;
-  rgw::sal::Attrs attrs;
   bool is_truncated;
 
   RGWUsageStats global_stats;
@@ -1348,8 +1347,6 @@ protected:
   RGWQuotaInfo new_quota;
   bool new_quota_extracted;
 
-  RGWObjVersionTracker acct_op_tracker;
-
   RGWAccessControlPolicy policy;
   bool has_policy;
 
index d12f7f4d6a52e1b412a7fb9f7dd01e5fc15a0445..2f579f4d2a3d47ee68341611daa90e19bc98c29c 100644 (file)
@@ -1849,9 +1849,8 @@ int RGWHandler_REST::init_permissions(RGWOp* op, optional_yield y)
     // We don't need user policies in case of STS token returned by AssumeRole, hence the check for user type
     if (! s->user->get_id().empty() && s->auth.identity->get_identity_type() != TYPE_ROLE) {
       try {
-       rgw::sal::Attrs uattrs;
-        if (auto ret = s->user->read_attrs(s, y, &uattrs); ! ret) {
-          auto user_policies = get_iam_user_policy_from_attr(s->cct, uattrs, s->user->get_tenant());
+        if (auto ret = s->user->read_attrs(s, y); ! ret) {
+          auto user_policies = get_iam_user_policy_from_attr(s->cct, s->user->get_attrs(), s->user->get_tenant());
           s->iam_user_policies.insert(s->iam_user_policies.end(),
                                       std::make_move_iterator(user_policies.begin()),
                                       std::make_move_iterator(user_policies.end()));
index d5f3a93d8cc2baf87d85a4bd8d34e37ee774c632..478695082d431c2e7e9066ada96348c59048a848 100644 (file)
@@ -175,7 +175,7 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets)
     dump_account_metadata(s,
             global_stats,
             policies_stats,
-            attrs,
+            s->user->get_attrs(),
             s->user->get_info().user_quota,
             static_cast<RGWAccessControlPolicy_SWIFTAcct&>(*s->user_acl));
     dump_errno(s);
@@ -281,7 +281,7 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_end()
     dump_account_metadata(s,
             global_stats,
             policies_stats,
-            attrs,
+            s->user->get_attrs(),
             s->user->get_info().user_quota,
             static_cast<RGWAccessControlPolicy_SWIFTAcct&>(*s->user_acl));
     dump_errno(s);
@@ -545,7 +545,8 @@ static void dump_container_metadata(struct req_state *s,
 void RGWStatAccount_ObjStore_SWIFT::execute(optional_yield y)
 {
   RGWStatAccount_ObjStore::execute(y);
-  op_ret = s->user->read_attrs(s, s->yield, &attrs);
+  op_ret = s->user->read_attrs(s, s->yield);
+  attrs = s->user->get_attrs();
 }
 
 void RGWStatAccount_ObjStore_SWIFT::send_response()
index a56ac49cbe18c08a527ff0e70b500a6565a26f0a..eb55313da736705d7d8d5f25b68067519bf222c8 100644 (file)
@@ -126,8 +126,7 @@ void RGWPutUserPolicy::execute(optional_yield y)
     return;
   }
 
-  rgw::sal::Attrs uattrs;
-  op_ret = user->read_attrs(s, s->yield, &uattrs);
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
@@ -143,20 +142,16 @@ void RGWPutUserPolicy::execute(optional_yield y)
   try {
     const Policy p(s->cct, s->user->get_tenant(), bl);
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-      bufferlist out_bl = uattrs[RGW_ATTR_USER_POLICY];
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+      bufferlist out_bl = it->second;
       decode(policies, out_bl);
     }
     bufferlist in_bl;
     policies[policy_name] = policy;
     encode(policies, in_bl);
-    uattrs[RGW_ATTR_USER_POLICY] = in_bl;
+    user->get_attrs()[RGW_ATTR_USER_POLICY] = in_bl;
 
-    RGWObjVersionTracker objv_tracker;
-    op_ret = user->store_info(s, s->yield,
-                             RGWUserCtl::PutParams()
-                             .set_objv_tracker(&objv_tracker)
-                             .set_attrs(&uattrs));
+    op_ret = user->store_info(s, s->yield, false);
     if (op_ret < 0) {
       op_ret = -ERR_INTERNAL_ERROR;
     }
@@ -201,8 +196,7 @@ void RGWGetUserPolicy::execute(optional_yield y)
   }
 
   std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
-  rgw::sal::Attrs uattrs;
-  op_ret = user->read_attrs(s, s->yield, &uattrs);
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
     ldpp_dout(this, 0) << "ERROR: attrs not found for user" << user_name << dendl;
     op_ret = -ERR_NO_SUCH_ENTITY;
@@ -216,8 +210,8 @@ void RGWGetUserPolicy::execute(optional_yield y)
     s->formatter->close_section();
     s->formatter->open_object_section("GetUserPolicyResult");
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-      bufferlist bl = uattrs[RGW_ATTR_USER_POLICY];
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+      bufferlist bl = it->second;
       decode(policies, bl);
       if (auto it = policies.find(policy_name); it != policies.end()) {
         policy = policies[policy_name];
@@ -265,8 +259,7 @@ void RGWListUserPolicies::execute(optional_yield y)
   }
 
   std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
-  rgw::sal::Attrs uattrs;
-  op_ret = user->read_attrs(s, s->yield, &uattrs);
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
     ldpp_dout(this, 0) << "ERROR: attrs not found for user" << user_name << dendl;
     op_ret = -ERR_NO_SUCH_ENTITY;
@@ -275,13 +268,13 @@ void RGWListUserPolicies::execute(optional_yield y)
 
   if (op_ret == 0) {
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
       s->formatter->open_object_section("ListUserPoliciesResponse");
       s->formatter->open_object_section("ResponseMetadata");
       s->formatter->dump_string("RequestId", s->trans_id);
       s->formatter->close_section();
       s->formatter->open_object_section("ListUserPoliciesResult");
-      bufferlist bl = uattrs[RGW_ATTR_USER_POLICY];
+      bufferlist bl = it->second;
       decode(policies, bl);
       for (const auto& p : policies) {
         s->formatter->open_object_section("PolicyNames");
@@ -333,8 +326,7 @@ void RGWDeleteUserPolicy::execute(optional_yield y)
     return;
   }
 
-  rgw::sal::Attrs uattrs;
-  op_ret = user->read_attrs(this, s->yield, &uattrs);
+  op_ret = user->read_attrs(this, s->yield);
   if (op_ret == -ENOENT) {
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
@@ -353,22 +345,17 @@ void RGWDeleteUserPolicy::execute(optional_yield y)
   }
 
   map<string, string> policies;
-  if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-    bufferlist out_bl = uattrs[RGW_ATTR_USER_POLICY];
+  if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+    bufferlist out_bl = it->second;
     decode(policies, out_bl);
 
     if (auto p = policies.find(policy_name); p != policies.end()) {
       bufferlist in_bl;
       policies.erase(p);
       encode(policies, in_bl);
-      uattrs[RGW_ATTR_USER_POLICY] = in_bl;
-
-      RGWObjVersionTracker objv_tracker;
-      op_ret = user->store_info(s, s->yield,
-                               RGWUserCtl::PutParams()
-                               .set_old_info(&user->get_info())
-                               .set_objv_tracker(&objv_tracker)
-                               .set_attrs(&uattrs));
+      user->get_attrs()[RGW_ATTR_USER_POLICY] = in_bl;
+
+      op_ret = user->store_info(s, s->yield, false);
       if (op_ret < 0) {
         op_ret = -ERR_INTERNAL_ERROR;
       }
index 1a00e407ffb8517fdb34271fae2d3de88fed6c2a..1bc47c84ad3b905f887ee05b66eae7938b21c4c3 100644 (file)
@@ -242,6 +242,7 @@ class User {
   protected:
     RGWUserInfo info;
     RGWObjVersionTracker objv_tracker;
+    Attrs attrs;
 
   public:
     User() : info() {}
@@ -270,7 +271,7 @@ class User {
     const RGWUserCaps& get_caps() const { return info.caps; }
     static bool empty(User* u) { return (!u || u->info.user_id.id.empty()); }
     static bool empty(std::unique_ptr<User>& u) { return (!u || u->info.user_id.id.empty()); }
-    virtual int read_attrs(const DoutPrefixProvider* dpp, optional_yield y, Attrs* uattrs, RGWObjVersionTracker* tracker = nullptr) = 0;
+    virtual int read_attrs(const DoutPrefixProvider* dpp, optional_yield y) = 0;
     virtual int read_stats(optional_yield y, RGWStorageStats* stats,
                           ceph::real_time* last_stats_sync = nullptr,
                           ceph::real_time* last_stats_update = nullptr) = 0;
@@ -281,10 +282,12 @@ class User {
                           map<rgw_user_bucket, rgw_usage_log_entry>& usage) = 0;
     virtual int trim_usage(uint64_t start_epoch, uint64_t end_epoch) = 0;
     virtual RGWObjVersionTracker& get_version_tracker() { return objv_tracker; }
+    virtual Attrs& get_attrs() { return attrs; }
+    virtual void set_attrs(Attrs& _attrs) { attrs = _attrs; }
 
     /* Placeholders */
     virtual int load_by_id(const DoutPrefixProvider* dpp, optional_yield y) = 0;
-    virtual int store_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::PutParams& params = {}) = 0;
+    virtual int store_info(const DoutPrefixProvider* dpp, optional_yield y, bool exclusive, RGWUserInfo* old_info = nullptr) = 0;
     virtual int remove_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::RemoveParams& params = {}) = 0;
 
     /* dang temporary; will be removed when User is complete */
index 486b875782b58250833626f7faa7e7b7e625012e..a8d0c15cc761bb4e8bd50d2faf82a77a14034bf8 100644 (file)
@@ -148,9 +148,9 @@ Bucket* RadosUser::create_bucket(rgw_bucket& bucket,
   return NULL;
 }
 
-int RadosUser::read_attrs(const DoutPrefixProvider* dpp, optional_yield y, Attrs* uattrs, RGWObjVersionTracker* tracker)
+int RadosUser::read_attrs(const DoutPrefixProvider* dpp, optional_yield y)
 {
-  return store->ctl()->user->get_attrs_by_uid(dpp, get_id(), uattrs, y, tracker);
+  return store->ctl()->user->get_attrs_by_uid(dpp, get_id(), &attrs, y, &objv_tracker);
 }
 
 int RadosUser::read_stats(optional_yield y, RGWStorageStats* stats,
@@ -193,9 +193,13 @@ int RadosUser::load_by_id(const DoutPrefixProvider* dpp, optional_yield y)
     return store->ctl()->user->get_info_by_uid(dpp, info.user_id, &info, y, RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker));
 }
 
-int RadosUser::store_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::PutParams& params)
+int RadosUser::store_info(const DoutPrefixProvider* dpp, optional_yield y, bool exclusive, RGWUserInfo* old_info)
 {
-    return store->ctl()->user->store_info(dpp, info, y, params);
+    return store->ctl()->user->store_info(dpp, info, y,
+                                         RGWUserCtl::PutParams().set_objv_tracker(&objv_tracker)
+                                         .set_exclusive(exclusive)
+                                         .set_attrs(&attrs)
+                                         .set_old_info(old_info));
 }
 
 int RadosUser::remove_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::RemoveParams& params)
index 7b5e0c5e4bdf16002c0c675e5f4a2385dbd9c32a..5f8f9219a0a516a5aca0378953a5baf903dd3937 100644 (file)
@@ -52,7 +52,7 @@ class RadosUser : public User {
                     uint64_t max, bool need_stats, BucketList& buckets,
                     optional_yield y) override;
     virtual Bucket* create_bucket(rgw_bucket& bucket, ceph::real_time creation_time) override;
-    virtual int read_attrs(const DoutPrefixProvider* dpp, optional_yield y, Attrs* uattrs, RGWObjVersionTracker* tracker) override;
+    virtual int read_attrs(const DoutPrefixProvider* dpp, optional_yield y) override;
     virtual int read_stats(optional_yield y, RGWStorageStats* stats,
                           ceph::real_time* last_stats_sync = nullptr,
                           ceph::real_time* last_stats_update = nullptr) override;
@@ -65,7 +65,7 @@ class RadosUser : public User {
 
     /* Placeholders */
     virtual int load_by_id(const DoutPrefixProvider* dpp, optional_yield y) override;
-    virtual int store_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::PutParams& params = {}) override;
+    virtual int store_info(const DoutPrefixProvider* dpp, optional_yield y, bool exclusive, RGWUserInfo* old_info = nullptr) override;
     virtual int remove_info(const DoutPrefixProvider* dpp, optional_yield y, const RGWUserCtl::RemoveParams& params = {}) override;
 
     friend class RadosBucket;
index c7863c57e71f22fc7306dff71ab4ddb509802411..bd0487724d7574c00afeaac8ee8a9edec86c9dac 100644 (file)
@@ -322,9 +322,7 @@ int STSService::storeARN(const DoutPrefixProvider *dpp, string& arn, optional_yi
 
   user->get_info().assumed_role_arn = arn;
 
-  ret = user->store_info(dpp, y, RGWUserCtl::PutParams()
-                           .set_old_info(&user->get_info())
-                           .set_exclusive(false));
+  ret = user->store_info(dpp, y, false, &user->get_info());
   if (ret < 0) {
     return -ERR_INTERNAL_ERROR;
   }
index 0c46d9fb8369b276b549d1b6c2cc5a4ca60dcc80..de71570f50351addf3264c4821267495f7e30c14 100644 (file)
@@ -1565,9 +1565,8 @@ int RGWUser::update(const DoutPrefixProvider *dpp, RGWUserAdminOpState& op_state
 
   RGWUserInfo *pold_info = (is_populated() ? &old_info : nullptr);
 
-  ret = user->store_info(dpp, y, RGWUserCtl::PutParams()
-                        .set_old_info(pold_info)
-                        .set_objv_tracker(&op_state.objv));
+  ret = user->store_info(dpp, y, false, pold_info);
+  op_state.objv = user->get_version_tracker();
   if (ret < 0) {
     set_err_msg(err_msg, "unable to store user info");
     return ret;
@@ -1663,12 +1662,9 @@ int RGWUser::execute_rename(const DoutPrefixProvider *dpp, RGWUserAdminOpState&
   std::unique_ptr<rgw::sal::User> user;
   user = store->get_user(new_user->get_id());
 
-  RGWObjVersionTracker objv;
   const bool exclusive = !op_state.get_overwrite_new_user(); // overwrite if requested
 
-  ret = user->store_info(dpp, y, RGWUserCtl::PutParams()
-                           .set_objv_tracker(&objv)
-                           .set_exclusive(exclusive));
+  ret = user->store_info(dpp, y, exclusive);
   if (ret == -EEXIST) {
     set_err_msg(err_msg, "user name given by --new-uid already exists");
     return ret;
@@ -1731,7 +1727,7 @@ int RGWUser::execute_rename(const DoutPrefixProvider *dpp, RGWUserAdminOpState&
   // associated index objects
   RGWUserInfo& user_info = op_state.get_user_info();
   user_info.user_id = new_user->get_id();
-  op_state.objv = objv;
+  op_state.objv = user->get_version_tracker();
 
   rename_swift_keys(new_user->get_id(), user_info.swift_keys);
 
index 88dc52594b7b08cc924d3586d4355e63b2642d93..ad7c0eb8e0465895cee22e048be49f5ee641eded 100644 (file)
@@ -34,7 +34,7 @@ public:
     return nullptr;
   }
 
-  virtual int read_attrs(const DoutPrefixProvider *dpp, optional_yield y, sal::Attrs* uattrs, RGWObjVersionTracker* tracker) override {
+  virtual int read_attrs(const DoutPrefixProvider *dpp, optional_yield y) override {
     return 0;
   }