Skip to content

Commit a2b37a1

Browse files
committed
rgw/metadata: use raw RGWMetadataHandler for user metadata
Signed-off-by: Casey Bodley <[email protected]>
1 parent 62e95e1 commit a2b37a1

File tree

6 files changed

+231
-216
lines changed

6 files changed

+231
-216
lines changed

src/rgw/driver/rados/rgw_service.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ int RGWServices_Def::init(CephContext *cct,
119119
} else {
120120
sysobj->init(driver->getRados()->get_rados_handle(), sysobj_core.get());
121121
}
122-
user_rados->init(driver->getRados()->get_rados_handle(), zone.get(), sysobj.get(), sysobj_cache.get(),
123-
meta.get(), meta_be_sobj.get(), sync_modules.get());
122+
user_rados->init(driver->getRados()->get_rados_handle(), zone.get(), mdlog.get(),
123+
sysobj.get(), sysobj_cache.get(), meta.get());
124124
role_rados->init(zone.get(), meta.get(), meta_be_sobj.get(), sysobj.get());
125125
can_shutdown = true;
126126

@@ -365,7 +365,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
365365
{
366366
meta.mgr.reset(new RGWMetadataManager(svc.meta));
367367

368-
meta.user.reset(RGWUserMetaHandlerAllocator::alloc(svc.user));
368+
meta.user = create_user_metadata_handler(svc.user);
369369

370370
bucket.reset(new RGWBucketCtl(svc.zone,
371371
svc.bucket,
@@ -391,7 +391,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
391391
meta.group = rgwrados::group::create_metadata_handler(
392392
*svc.sysobj, rados, svc.zone->get_zone_params());
393393

394-
user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get()));
394+
user = std::make_unique<RGWUserCtl>(svc.zone, svc.user);
395395

396396
meta.topic_cache = std::make_unique<RGWChainedCacheImpl<rgwrados::topic::cache_entry>>();
397397
meta.topic_cache->init(svc.cache);

src/rgw/driver/rados/rgw_user.cc

Lines changed: 152 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
22
// vim: ts=8 sw=2 smarttab ft=cpp
33

4+
#include "rgw_user.h"
45
#include "common/errno.h"
56

6-
#include "rgw_user.h"
77

88
#include "rgw_account.h"
99
#include "rgw_bucket.h"
10+
#include "rgw_metadata.h"
11+
#include "rgw_metadata_lister.h"
1012
#include "rgw_quota.h"
1113
#include "rgw_rest_iam.h" // validate_iam_user_name()
1214

@@ -2701,42 +2703,48 @@ int RGWUserAdminOp_Caps::remove(const DoutPrefixProvider *dpp,
27012703
return 0;
27022704
}
27032705

2704-
class RGWUserMetadataHandler : public RGWMetadataHandler_GenericMetaBE {
2705-
public:
2706-
struct Svc {
2707-
RGWSI_User *user{nullptr};
2708-
} svc;
2706+
struct RGWUserCompleteInfo {
2707+
RGWUserInfo info;
2708+
std::map<std::string, bufferlist> attrs;
2709+
bool has_attrs{false};
27092710

2710-
RGWUserMetadataHandler(RGWSI_User *user_svc) {
2711-
base_init(user_svc->ctx(), user_svc->get_be_handler());
2712-
svc.user = user_svc;
2711+
void dump(Formatter * const f) const {
2712+
info.dump(f);
2713+
encode_json("attrs", attrs, f);
27132714
}
27142715

2715-
~RGWUserMetadataHandler() {}
2716-
2717-
string get_type() override { return "user"; }
2716+
void decode_json(JSONObj *obj) {
2717+
decode_json_obj(info, obj);
2718+
has_attrs = JSONDecoder::decode_json("attrs", attrs, obj);
2719+
}
2720+
};
27182721

2719-
int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y, const DoutPrefixProvider *dpp) override {
2720-
RGWUserCompleteInfo uci;
2721-
RGWObjVersionTracker objv_tracker;
2722-
real_time mtime;
2722+
class RGWUserMetadataObject : public RGWMetadataObject {
2723+
RGWUserCompleteInfo uci;
2724+
public:
2725+
RGWUserMetadataObject(const RGWUserCompleteInfo& uci,
2726+
const obj_version& v, ceph::real_time m)
2727+
: RGWMetadataObject(v, m), uci(uci) {}
27232728

2724-
rgw_user user = RGWSI_User::user_from_meta_key(entry);
2729+
void dump(Formatter *f) const override {
2730+
uci.dump(f);
2731+
}
27252732

2726-
int ret = svc.user->read_user_info(user, &uci.info, &objv_tracker,
2727-
&mtime, nullptr, &uci.attrs,
2728-
y, dpp);
2729-
if (ret < 0) {
2730-
return ret;
2731-
}
2733+
RGWUserCompleteInfo& get_uci() {
2734+
return uci;
2735+
}
2736+
};
27322737

2733-
RGWUserMetadataObject *mdo = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime);
2734-
*obj = mdo;
2738+
class RGWUserMetadataHandler : public RGWMetadataHandler {
2739+
RGWSI_User *svc_user{nullptr};
2740+
public:
2741+
explicit RGWUserMetadataHandler(RGWSI_User* svc_user)
2742+
: svc_user(svc_user) {}
27352743

2736-
return 0;
2737-
}
2744+
string get_type() override { return "user"; }
27382745

2739-
RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) override {
2746+
RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv,
2747+
const ceph::real_time& mtime) override {
27402748
RGWUserCompleteInfo uci;
27412749

27422750
try {
@@ -2748,87 +2756,144 @@ class RGWUserMetadataHandler : public RGWMetadataHandler_GenericMetaBE {
27482756
return new RGWUserMetadataObject(uci, objv, mtime);
27492757
}
27502758

2751-
int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
2752-
RGWMetadataObject *obj,
2753-
RGWObjVersionTracker& objv_tracker,
2754-
optional_yield y, const DoutPrefixProvider *dpp,
2755-
RGWMDLogSyncType type, bool from_remote_zone) override;
2756-
2757-
int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
2758-
optional_yield y, const DoutPrefixProvider *dpp) override {
2759-
RGWUserInfo info;
2759+
int get(std::string& entry, RGWMetadataObject** obj, optional_yield y,
2760+
const DoutPrefixProvider *dpp) override;
2761+
int put(std::string& entry, RGWMetadataObject* obj,
2762+
RGWObjVersionTracker& objv_tracker,
2763+
optional_yield y, const DoutPrefixProvider* dpp,
2764+
RGWMDLogSyncType type, bool from_remote_zone) override;
2765+
int remove(std::string& entry, RGWObjVersionTracker& objv_tracker,
2766+
optional_yield y, const DoutPrefixProvider *dpp) override;
2767+
2768+
int mutate(const std::string& entry, const ceph::real_time& mtime,
2769+
RGWObjVersionTracker* objv_tracker, optional_yield y,
2770+
const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
2771+
std::function<int()> f) override;
2772+
2773+
int list_keys_init(const DoutPrefixProvider* dpp, const std::string& marker,
2774+
void** phandle) override;
2775+
int list_keys_next(const DoutPrefixProvider* dpp, void* handle, int max,
2776+
std::list<std::string>& keys, bool* truncated) override;
2777+
void list_keys_complete(void *handle) override;
2778+
std::string get_marker(void *handle) override;
2779+
};
27602780

2761-
rgw_user user = RGWSI_User::user_from_meta_key(entry);
2781+
int RGWUserMetadataHandler::get(std::string& entry, RGWMetadataObject **obj,
2782+
optional_yield y, const DoutPrefixProvider *dpp)
2783+
{
2784+
RGWUserCompleteInfo uci;
2785+
RGWObjVersionTracker objv_tracker;
2786+
real_time mtime;
27622787

2763-
int ret = svc.user->read_user_info(user, &info, nullptr,
2764-
nullptr, nullptr, nullptr,
2765-
y, dpp);
2766-
if (ret < 0) {
2767-
return ret;
2768-
}
2788+
rgw_user user = RGWSI_User::user_from_meta_key(entry);
27692789

2770-
return svc.user->remove_user_info(info, &objv_tracker, y, dpp);
2790+
int ret = svc_user->read_user_info(user, &uci.info, &objv_tracker,
2791+
&mtime, nullptr, &uci.attrs,
2792+
y, dpp);
2793+
if (ret < 0) {
2794+
return ret;
27712795
}
2772-
};
27732796

2774-
class RGWMetadataHandlerPut_User : public RGWMetadataHandlerPut_SObj
2797+
*obj = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime);
2798+
return 0;
2799+
}
2800+
2801+
int RGWUserMetadataHandler::put(std::string& entry, RGWMetadataObject *obj,
2802+
RGWObjVersionTracker& objv_tracker,
2803+
optional_yield y, const DoutPrefixProvider *dpp,
2804+
RGWMDLogSyncType type, bool from_remote_zone)
27752805
{
2776-
RGWUserMetadataHandler *uhandler;
2777-
RGWUserMetadataObject *uobj;
2778-
public:
2779-
RGWMetadataHandlerPut_User(RGWUserMetadataHandler *_handler,
2780-
RGWSI_MetaBackend_Handler::Op *op, string& entry,
2781-
RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
2782-
optional_yield y,
2783-
RGWMDLogSyncType type, bool from_remote_zone) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
2784-
uhandler(_handler) {
2785-
uobj = static_cast<RGWUserMetadataObject *>(obj);
2806+
const rgw_user user = RGWSI_User::user_from_meta_key(entry);
2807+
2808+
// read existing user info
2809+
std::optional old = RGWUserCompleteInfo{};
2810+
int ret = svc_user->read_user_info(user, &old->info, &objv_tracker,
2811+
nullptr, nullptr, &old->attrs, y, dpp);
2812+
if (ret == -ENOENT) {
2813+
old = std::nullopt;
2814+
} else if (ret < 0) {
2815+
return ret;
27862816
}
2817+
RGWUserInfo* pold_info = (old ? &old->info : nullptr);
27872818

2788-
int put_checked(const DoutPrefixProvider *dpp) override;
2789-
};
2819+
// store the updated user info
2820+
auto newobj = static_cast<RGWUserMetadataObject*>(obj);
2821+
RGWUserCompleteInfo& uci = newobj->get_uci();
2822+
auto pattrs = (uci.has_attrs ? &uci.attrs : nullptr);
2823+
auto mtime = obj->get_mtime();
27902824

2791-
int RGWUserMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
2792-
RGWMetadataObject *obj,
2793-
RGWObjVersionTracker& objv_tracker,
2794-
optional_yield y, const DoutPrefixProvider *dpp,
2795-
RGWMDLogSyncType type, bool from_remote_zone)
2796-
{
2797-
RGWMetadataHandlerPut_User put_op(this, op, entry, obj, objv_tracker, y, type, from_remote_zone);
2798-
return do_put_operate(&put_op, dpp);
2825+
ret = svc_user->store_user_info(uci.info, pold_info, &objv_tracker,
2826+
mtime, false, pattrs, y, dpp);
2827+
if (ret < 0) {
2828+
return ret;
2829+
}
2830+
2831+
return STATUS_APPLIED;
27992832
}
28002833

2801-
int RGWMetadataHandlerPut_User::put_checked(const DoutPrefixProvider *dpp)
2834+
int RGWUserMetadataHandler::remove(std::string& entry, RGWObjVersionTracker& objv_tracker,
2835+
optional_yield y, const DoutPrefixProvider *dpp)
28022836
{
2803-
RGWUserMetadataObject *orig_obj = static_cast<RGWUserMetadataObject *>(old_obj);
2804-
RGWUserCompleteInfo& uci = uobj->get_uci();
2837+
RGWUserInfo info;
28052838

2806-
map<string, bufferlist> *pattrs{nullptr};
2807-
if (uci.has_attrs) {
2808-
pattrs = &uci.attrs;
2839+
rgw_user user = RGWSI_User::user_from_meta_key(entry);
2840+
2841+
int ret = svc_user->read_user_info(user, &info, nullptr,
2842+
nullptr, nullptr, nullptr,
2843+
y, dpp);
2844+
if (ret < 0) {
2845+
return ret;
28092846
}
28102847

2811-
RGWUserInfo *pold_info = (orig_obj ? &orig_obj->get_uci().info : nullptr);
2848+
return svc_user->remove_user_info(info, &objv_tracker, y, dpp);
2849+
};
28122850

2813-
auto mtime = obj->get_mtime();
2851+
int RGWUserMetadataHandler::mutate(const std::string& entry, const ceph::real_time& mtime,
2852+
RGWObjVersionTracker* objv_tracker, optional_yield y,
2853+
const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
2854+
std::function<int()> f)
2855+
{
2856+
return -ENOTSUP; // unused
2857+
}
28142858

2815-
int ret = uhandler->svc.user->store_user_info(uci.info, pold_info,
2816-
&objv_tracker, mtime,
2817-
false, pattrs, y, dpp);
2859+
int RGWUserMetadataHandler::list_keys_init(const DoutPrefixProvider* dpp,
2860+
const std::string& marker,
2861+
void** phandle)
2862+
{
2863+
std::unique_ptr<RGWMetadataLister> lister;
2864+
int ret = svc_user->create_lister(dpp, marker, lister);
28182865
if (ret < 0) {
28192866
return ret;
28202867
}
2868+
*phandle = lister.release(); // release ownership
2869+
return 0;
2870+
}
28212871

2822-
return STATUS_APPLIED;
2872+
int RGWUserMetadataHandler::list_keys_next(const DoutPrefixProvider* dpp,
2873+
void* handle, int max,
2874+
std::list<std::string>& keys,
2875+
bool* truncated)
2876+
{
2877+
auto lister = static_cast<RGWMetadataLister*>(handle);
2878+
return lister->get_next(dpp, max, keys, truncated);
2879+
}
2880+
2881+
void RGWUserMetadataHandler::list_keys_complete(void *handle)
2882+
{
2883+
delete static_cast<RGWMetadataLister*>(handle);
2884+
}
2885+
2886+
std::string RGWUserMetadataHandler::get_marker(void *handle)
2887+
{
2888+
auto lister = static_cast<RGWMetadataLister*>(handle);
2889+
return lister->get_marker();
28232890
}
28242891

28252892

2826-
RGWUserCtl::RGWUserCtl(RGWSI_Zone *zone_svc,
2827-
RGWSI_User *user_svc,
2828-
RGWUserMetadataHandler *_umhandler) : umhandler(_umhandler) {
2893+
RGWUserCtl::RGWUserCtl(RGWSI_Zone *zone_svc, RGWSI_User *user_svc)
2894+
{
28292895
svc.zone = zone_svc;
28302896
svc.user = user_svc;
2831-
be_handler = umhandler->get_be_handler();
28322897
}
28332898

28342899
template <class T>
@@ -2953,8 +3018,10 @@ int RGWUserCtl::remove_info(const DoutPrefixProvider *dpp,
29533018
return svc.user->remove_user_info(info, params.objv_tracker, y, dpp);
29543019
}
29553020

2956-
RGWMetadataHandler *RGWUserMetaHandlerAllocator::alloc(RGWSI_User *user_svc) {
2957-
return new RGWUserMetadataHandler(user_svc);
3021+
auto create_user_metadata_handler(RGWSI_User *user_svc)
3022+
-> std::unique_ptr<RGWMetadataHandler>
3023+
{
3024+
return std::make_unique<RGWUserMetadataHandler>(user_svc);
29583025
}
29593026

29603027
void rgw_user::dump(Formatter *f) const

0 commit comments

Comments
 (0)