]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/rados: load attrs with RadosUser
authorCasey Bodley <cbodley@redhat.com>
Fri, 1 Mar 2024 17:59:29 +0000 (12:59 -0500)
committerCasey Bodley <cbodley@redhat.com>
Wed, 10 Apr 2024 17:09:16 +0000 (13:09 -0400)
when auth looks up a user by key, that should also initialize the user's
attrs so we don't have to load them separately

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/driver/rados/rgw_user.cc
src/rgw/rgw_sal_dbstore.cc
src/rgw/services/svc_user.h
src/rgw/services/svc_user_rados.cc
src/rgw/services/svc_user_rados.h

index 8171e25689fb68c4896bfb1ed876c83277ce237b..84267e1b3cca241cf1b333fffb39e49aadab4364 100644 (file)
@@ -1033,8 +1033,12 @@ int RadosStore::get_user_by_access_key(const DoutPrefixProvider* dpp, const std:
   RGWUserInfo uinfo;
   User* u;
   RGWObjVersionTracker objv_tracker;
+  Attrs attrs;
 
-  int r = ctl()->user->get_info_by_access_key(dpp, key, &uinfo, y, RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker));
+  int r = ctl()->user->get_info_by_access_key(
+      dpp, key, &uinfo, y,
+      RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker)
+                             .set_attrs(&attrs));
   if (r < 0)
     return r;
 
@@ -1043,6 +1047,7 @@ int RadosStore::get_user_by_access_key(const DoutPrefixProvider* dpp, const std:
     return -ENOMEM;
 
   u->get_version_tracker() = objv_tracker;
+  u->get_attrs() = std::move(attrs);
 
   user->reset(u);
   return 0;
@@ -1053,8 +1058,12 @@ int RadosStore::get_user_by_email(const DoutPrefixProvider* dpp, const std::stri
   RGWUserInfo uinfo;
   User* u;
   RGWObjVersionTracker objv_tracker;
+  Attrs attrs;
 
-  int r = ctl()->user->get_info_by_email(dpp, email, &uinfo, y, RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker));
+  int r = ctl()->user->get_info_by_email(
+      dpp, email, &uinfo, y,
+      RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker)
+                             .set_attrs(&attrs));
   if (r < 0)
     return r;
 
@@ -1063,6 +1072,7 @@ int RadosStore::get_user_by_email(const DoutPrefixProvider* dpp, const std::stri
     return -ENOMEM;
 
   u->get_version_tracker() = objv_tracker;
+  u->get_attrs() = std::move(attrs);
 
   user->reset(u);
   return 0;
@@ -1073,8 +1083,12 @@ int RadosStore::get_user_by_swift(const DoutPrefixProvider* dpp, const std::stri
   RGWUserInfo uinfo;
   User* u;
   RGWObjVersionTracker objv_tracker;
+  Attrs attrs;
 
-  int r = ctl()->user->get_info_by_swift(dpp, user_str, &uinfo, y, RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker));
+  int r = ctl()->user->get_info_by_swift(
+      dpp, user_str, &uinfo, y,
+      RGWUserCtl::GetParams().set_objv_tracker(&objv_tracker)
+                             .set_attrs(&attrs));
   if (r < 0)
     return r;
 
@@ -1083,6 +1097,7 @@ int RadosStore::get_user_by_swift(const DoutPrefixProvider* dpp, const std::stri
     return -ENOMEM;
 
   u->get_version_tracker() = objv_tracker;
+  u->get_attrs() = std::move(attrs);
 
   user->reset(u);
   return 0;
index 9bc095de3563fba0c68e4e7c06baa9a2914b2924..b7067ca9c3c8ab5a05c242e3a1b2f17c88c39cc1 100644 (file)
@@ -2856,6 +2856,7 @@ int RGWUserCtl::get_info_by_email(const DoutPrefixProvider *dpp,
     return svc.user->get_user_info_by_email(op->ctx(), email,
                                             info,
                                             params.objv_tracker,
+                                            params.attrs,
                                             params.mtime,
                                             y,
                                             dpp);
@@ -2872,6 +2873,7 @@ int RGWUserCtl::get_info_by_swift(const DoutPrefixProvider *dpp,
     return svc.user->get_user_info_by_swift(op->ctx(), swift_name,
                                             info,
                                             params.objv_tracker,
+                                            params.attrs,
                                             params.mtime,
                                             y,
                                             dpp);
@@ -2888,6 +2890,7 @@ int RGWUserCtl::get_info_by_access_key(const DoutPrefixProvider *dpp,
     return svc.user->get_user_info_by_access_key(op->ctx(), access_key,
                                                  info,
                                                  params.objv_tracker,
+                                                 params.attrs,
                                                  params.mtime,
                                                  y,
                                                  dpp);
index 0b60ebf70ec56d2f939830a58fc333f2d09b8b6f..b734432cb4cc92dc9088f48fca463ee4ac84031e 100644 (file)
@@ -1506,9 +1506,10 @@ namespace rgw::sal {
     RGWUserInfo uinfo;
     User *u;
     int ret = 0;
+    rgw::sal::Attrs attrs;
     RGWObjVersionTracker objv_tracker;
 
-    ret = getDB()->get_user(dpp, string("access_key"), key, uinfo, nullptr,
+    ret = getDB()->get_user(dpp, string("access_key"), key, uinfo, &attrs,
         &objv_tracker);
 
     if (ret < 0)
@@ -1519,6 +1520,7 @@ namespace rgw::sal {
     if (!u)
       return -ENOMEM;
 
+    u->get_attrs() = std::move(attrs);
     u->get_version_tracker() = objv_tracker;
     user->reset(u);
 
@@ -1530,9 +1532,10 @@ namespace rgw::sal {
     RGWUserInfo uinfo;
     User *u;
     int ret = 0;
+    rgw::sal::Attrs attrs;
     RGWObjVersionTracker objv_tracker;
 
-    ret = getDB()->get_user(dpp, string("email"), email, uinfo, nullptr,
+    ret = getDB()->get_user(dpp, string("email"), email, uinfo, &attrs,
         &objv_tracker);
 
     if (ret < 0)
@@ -1543,6 +1546,7 @@ namespace rgw::sal {
     if (!u)
       return -ENOMEM;
 
+    u->get_attrs() = std::move(attrs);
     u->get_version_tracker() = objv_tracker;
     user->reset(u);
 
index af6d7c37d22b7c55aa3869918516e3358ffca503..7149f3e21979fee3fcccbf5124c6e33a92d419fe 100644 (file)
@@ -73,6 +73,7 @@ public:
   virtual int get_user_info_by_email(RGWSI_MetaBackend::Context *ctx,
                              const std::string& email, RGWUserInfo *info,
                              RGWObjVersionTracker *objv_tracker,
+                             std::map<std::string, bufferlist>* pattrs,
                              real_time *pmtime,
                              optional_yield y,
                              const DoutPrefixProvider *dpp) = 0;
@@ -80,6 +81,7 @@ public:
                              const std::string& swift_name,
                              RGWUserInfo *info,        /* out */
                              RGWObjVersionTracker * const objv_tracker,
+                             std::map<std::string, bufferlist>* pattrs,
                              real_time * const pmtime,
                              optional_yield y,
                              const DoutPrefixProvider *dpp) = 0;
@@ -87,6 +89,7 @@ public:
                                   const std::string& access_key,
                                   RGWUserInfo *info,
                                   RGWObjVersionTracker* objv_tracker,
+                                  std::map<std::string, bufferlist>* pattrs,
                                   real_time *pmtime,
                                   optional_yield y,
                                   const DoutPrefixProvider *dpp) = 0;
index 5f158569fa29314f8a2bbb6d7e01368a4e92b4d1..c061b964239f26550da82009ca6643c4683d169d 100644 (file)
@@ -245,7 +245,7 @@ public:
         continue;
       /* check if swift mapping exists */
       RGWUserInfo inf;
-      int r = svc.user->get_user_info_by_swift(ctx, id, &inf, nullptr, nullptr, y, dpp);
+      int r = svc.user->get_user_info_by_swift(ctx, id, &inf, nullptr, nullptr, nullptr, y, dpp);
       if (r >= 0 && inf.user_id != info.user_id &&
           (!old_info || inf.user_id != old_info->user_id)) {
         ldpp_dout(dpp, 0) << "WARNING: can't store user info, swift id (" << id
@@ -261,7 +261,7 @@ public:
       if (s3_key_active(old_info, id)) // old key already active
         continue;
       RGWUserInfo inf;
-      int r = svc.user->get_user_info_by_access_key(ctx, id, &inf, nullptr, nullptr, y, dpp);
+      int r = svc.user->get_user_info_by_access_key(ctx, id, &inf, nullptr, nullptr, nullptr, y, dpp);
       if (r >= 0 && inf.user_id != info.user_id &&
           (!old_info || inf.user_id != old_info->user_id)) {
         ldpp_dout(dpp, 0) << "WARNING: can't store user info, access key already mapped to another user" << dendl;
@@ -672,6 +672,7 @@ int RGWSI_User_RADOS::get_user_info_from_index(RGWSI_MetaBackend::Context* ctx,
                                                const rgw_pool& pool,
                                                RGWUserInfo *info,
                                                RGWObjVersionTracker* objv_tracker,
+                                               std::map<std::string, bufferlist>* pattrs,
                                                real_time* pmtime, optional_yield y,
                                                const DoutPrefixProvider* dpp)
 {
@@ -681,6 +682,8 @@ int RGWSI_User_RADOS::get_user_info_from_index(RGWSI_MetaBackend::Context* ctx,
     *info = e->info;
     if (objv_tracker)
       *objv_tracker = e->objv_tracker;
+    if (pattrs)
+      *pattrs = e->attrs;
     if (pmtime)
       *pmtime = e->mtime;
     return 0;
@@ -701,7 +704,7 @@ int RGWSI_User_RADOS::get_user_info_from_index(RGWSI_MetaBackend::Context* ctx,
 
   rgw_cache_entry_info cache_info;
   ret = read_user_info(ctx, rgw_user{uid.id}, &e.info, &e.objv_tracker,
-                       nullptr, &cache_info, nullptr, y, dpp);
+                       nullptr, &cache_info, &e.attrs, y, dpp);
   if (ret < 0) {
     return ret;
   }
@@ -713,6 +716,9 @@ int RGWSI_User_RADOS::get_user_info_from_index(RGWSI_MetaBackend::Context* ctx,
     *objv_tracker = e.objv_tracker;
   if (pmtime)
     *pmtime = e.mtime;
+  ldpp_dout(dpp, 20) << "get_user_info_from_index found " << e.attrs.size() << " xattrs" << dendl;
+  if (pattrs)
+    *pattrs = std::move(e.attrs);
 
   return 0;
 }
@@ -724,13 +730,14 @@ int RGWSI_User_RADOS::get_user_info_from_index(RGWSI_MetaBackend::Context* ctx,
 int RGWSI_User_RADOS::get_user_info_by_email(RGWSI_MetaBackend::Context *ctx,
                                        const string& email, RGWUserInfo *info,
                                        RGWObjVersionTracker *objv_tracker,
+                                       std::map<std::string, bufferlist>* pattrs,
                                        real_time *pmtime, optional_yield y,
                                        const DoutPrefixProvider *dpp)
 {
   std::string oid = email;
   boost::to_lower(oid);
   return get_user_info_from_index(ctx, oid, svc.zone->get_zone_params().user_email_pool,
-                                  info, objv_tracker, pmtime, y, dpp);
+                                  info, objv_tracker, pattrs, pmtime, y, dpp);
 }
 
 /**
@@ -741,13 +748,14 @@ int RGWSI_User_RADOS::get_user_info_by_swift(RGWSI_MetaBackend::Context *ctx,
                                        const string& swift_name,
                                        RGWUserInfo *info,        /* out */
                                        RGWObjVersionTracker * const objv_tracker,
+                                       std::map<std::string, bufferlist>* pattrs,
                                        real_time * const pmtime, optional_yield y,
                                        const DoutPrefixProvider *dpp)
 {
   return get_user_info_from_index(ctx,
                                   swift_name,
                                   svc.zone->get_zone_params().user_swift_pool,
-                                  info, objv_tracker, pmtime, y, dpp);
+                                  info, objv_tracker, pattrs, pmtime, y, dpp);
 }
 
 /**
@@ -758,13 +766,14 @@ int RGWSI_User_RADOS::get_user_info_by_access_key(RGWSI_MetaBackend::Context *ct
                                             const std::string& access_key,
                                             RGWUserInfo *info,
                                             RGWObjVersionTracker* objv_tracker,
+                                            std::map<std::string, bufferlist>* pattrs,
                                             real_time *pmtime, optional_yield y,
                                             const DoutPrefixProvider *dpp)
 {
   return get_user_info_from_index(ctx,
                                   access_key,
                                   svc.zone->get_zone_params().user_keys_pool,
-                                  info, objv_tracker, pmtime, y, dpp);
+                                  info, objv_tracker, pattrs, pmtime, y, dpp);
 }
 
 int RGWSI_User_RADOS::read_email_index(const DoutPrefixProvider* dpp,
index 3df275d227c36ede427038733d0056f8fafe8e66..406024e6fa8916c3252c46dfd8831be5e063b0d4 100644 (file)
@@ -47,6 +47,7 @@ class RGWSI_User_RADOS : public RGWSI_User
   struct user_info_cache_entry {
     RGWUserInfo info;
     RGWObjVersionTracker objv_tracker;
+    std::map<std::string, bufferlist> attrs;
     real_time mtime;
   };
 
@@ -60,6 +61,7 @@ class RGWSI_User_RADOS : public RGWSI_User
                                const rgw_pool& pool,
                                RGWUserInfo *info,
                                RGWObjVersionTracker * const objv_tracker,
+                               std::map<std::string, bufferlist>* pattrs,
                                real_time * const pmtime,
                                optional_yield y,
                                const DoutPrefixProvider *dpp);
@@ -127,6 +129,7 @@ public:
   int get_user_info_by_email(RGWSI_MetaBackend::Context *ctx,
                              const std::string& email, RGWUserInfo *info,
                              RGWObjVersionTracker *objv_tracker,
+                             std::map<std::string, bufferlist>* pattrs,
                              real_time *pmtime,
                              optional_yield y,
                              const DoutPrefixProvider *dpp) override;
@@ -134,6 +137,7 @@ public:
                              const std::string& swift_name,
                              RGWUserInfo *info,        /* out */
                              RGWObjVersionTracker * const objv_tracker,
+                             std::map<std::string, bufferlist>* pattrs,
                              real_time * const pmtime,
                              optional_yield y,
                              const DoutPrefixProvider *dpp) override;
@@ -141,6 +145,7 @@ public:
                                   const std::string& access_key,
                                   RGWUserInfo *info,
                                   RGWObjVersionTracker* objv_tracker,
+                                  std::map<std::string, bufferlist>* pattrs,
                                   real_time *pmtime,
                                   optional_yield y,
                                   const DoutPrefixProvider *dpp) override;