From ca69e6879358f781fab7bdbcdcbe3e49fdaee81a Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 1 Mar 2024 12:59:29 -0500 Subject: [PATCH] rgw/rados: load attrs with RadosUser 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 --- src/rgw/driver/rados/rgw_sal_rados.cc | 21 ++++++++++++++++++--- src/rgw/driver/rados/rgw_user.cc | 3 +++ src/rgw/rgw_sal_dbstore.cc | 8 ++++++-- src/rgw/services/svc_user.h | 3 +++ src/rgw/services/svc_user_rados.cc | 21 +++++++++++++++------ src/rgw/services/svc_user_rados.h | 5 +++++ 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 8171e25689fb6..84267e1b3cca2 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -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; diff --git a/src/rgw/driver/rados/rgw_user.cc b/src/rgw/driver/rados/rgw_user.cc index 9bc095de3563f..b7067ca9c3c8a 100644 --- a/src/rgw/driver/rados/rgw_user.cc +++ b/src/rgw/driver/rados/rgw_user.cc @@ -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); diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index 0b60ebf70ec56..b734432cb4cc9 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -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); diff --git a/src/rgw/services/svc_user.h b/src/rgw/services/svc_user.h index af6d7c37d22b7..7149f3e21979f 100644 --- a/src/rgw/services/svc_user.h +++ b/src/rgw/services/svc_user.h @@ -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* 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* 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* pattrs, real_time *pmtime, optional_yield y, const DoutPrefixProvider *dpp) = 0; diff --git a/src/rgw/services/svc_user_rados.cc b/src/rgw/services/svc_user_rados.cc index 5f158569fa293..c061b964239f2 100644 --- a/src/rgw/services/svc_user_rados.cc +++ b/src/rgw/services/svc_user_rados.cc @@ -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* 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* 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* 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* 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, diff --git a/src/rgw/services/svc_user_rados.h b/src/rgw/services/svc_user_rados.h index 3df275d227c36..406024e6fa891 100644 --- a/src/rgw/services/svc_user_rados.h +++ b/src/rgw/services/svc_user_rados.h @@ -47,6 +47,7 @@ class RGWSI_User_RADOS : public RGWSI_User struct user_info_cache_entry { RGWUserInfo info; RGWObjVersionTracker objv_tracker; + std::map 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* 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* 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* 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* pattrs, real_time *pmtime, optional_yield y, const DoutPrefixProvider *dpp) override; -- 2.39.5