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
28342899template <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
29603027void rgw_user::dump (Formatter *f) const
0 commit comments