1818
1919#include " rgw_common.h"
2020#include " rgw_metadata.h"
21+ #include " rgw_metadata_lister.h"
2122#include " rgw_tools.h"
2223#include " rgw_role.h"
2324
@@ -366,49 +367,41 @@ class RGWRoleMetadataObject: public RGWMetadataObject {
366367 }
367368};
368369
369- class RGWRoleMetadataHandler : public RGWMetadataHandler_GenericMetaBE
370- {
370+ class RGWRoleMetadataHandler : public RGWMetadataHandler {
371+ rgw::sal::Driver& driver;
372+ RGWSI_SysObj& sysobj;
371373 public:
372- RGWRoleMetadataHandler (rgw::sal::Driver* driver, RGWSI_Role_RADOS *role_svc);
374+ RGWRoleMetadataHandler (rgw::sal::Driver& driver, RGWSI_SysObj& sysobj)
375+ : driver(driver), sysobj(sysobj) {}
373376
374377 std::string get_type () final { return " roles" ; }
375378
376379 RGWMetadataObject *get_meta_obj (JSONObj *jo,
377380 const obj_version& objv,
378381 const ceph::real_time& mtime);
379382
380- int do_get (RGWSI_MetaBackend_Handler::Op *op,
381- std::string& entry,
382- RGWMetadataObject **obj,
383- optional_yield y,
384- const DoutPrefixProvider *dpp) final ;
385-
386- int do_remove (RGWSI_MetaBackend_Handler::Op *op,
387- std::string& entry,
388- RGWObjVersionTracker& objv_tracker,
389- optional_yield y,
390- const DoutPrefixProvider *dpp) final ;
391-
392- int do_put (RGWSI_MetaBackend_Handler::Op *op,
393- std::string& entr,
394- RGWMetadataObject *obj,
395- RGWObjVersionTracker& objv_tracker,
396- optional_yield y,
397- const DoutPrefixProvider *dpp,
398- RGWMDLogSyncType type,
399- bool from_remote_zone) override ;
400-
401- private:
402- rgw::sal::Driver* driver;
383+ int get (std::string& entry, RGWMetadataObject** obj, optional_yield y,
384+ const DoutPrefixProvider *dpp) override ;
385+ int put (std::string& entry, RGWMetadataObject* obj,
386+ RGWObjVersionTracker& objv_tracker,
387+ optional_yield y, const DoutPrefixProvider* dpp,
388+ RGWMDLogSyncType type, bool from_remote_zone) override ;
389+ int remove (std::string& entry, RGWObjVersionTracker& objv_tracker,
390+ optional_yield y, const DoutPrefixProvider *dpp) override ;
391+
392+ int mutate (const std::string& entry, const ceph::real_time& mtime,
393+ RGWObjVersionTracker* objv_tracker, optional_yield y,
394+ const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
395+ std::function<int ()> f) override ;
396+
397+ int list_keys_init (const DoutPrefixProvider* dpp, const std::string& marker,
398+ void ** phandle) override ;
399+ int list_keys_next (const DoutPrefixProvider* dpp, void * handle, int max,
400+ std::list<std::string>& keys, bool * truncated) override ;
401+ void list_keys_complete (void *handle) override ;
402+ std::string get_marker (void *handle) override ;
403403};
404404
405- RGWRoleMetadataHandler::RGWRoleMetadataHandler (rgw::sal::Driver* driver,
406- RGWSI_Role_RADOS *role_svc)
407- : driver(driver)
408- {
409- base_init (role_svc->ctx (), role_svc->get_be_handler ());
410- }
411-
412405RGWMetadataObject *RGWRoleMetadataHandler::get_meta_obj (JSONObj *jo,
413406 const obj_version& objv,
414407 const ceph::real_time& mtime)
@@ -424,13 +417,10 @@ RGWMetadataObject *RGWRoleMetadataHandler::get_meta_obj(JSONObj *jo,
424417 return new RGWRoleMetadataObject (info, objv, mtime);
425418}
426419
427- int RGWRoleMetadataHandler::do_get (RGWSI_MetaBackend_Handler::Op *op,
428- std::string& entry,
429- RGWMetadataObject **obj,
430- optional_yield y,
431- const DoutPrefixProvider *dpp)
420+ int RGWRoleMetadataHandler::get (std::string& entry, RGWMetadataObject **obj,
421+ optional_yield y, const DoutPrefixProvider *dpp)
432422{
433- std::unique_ptr<rgw::sal::RGWRole> role = driver-> get_role (entry);
423+ std::unique_ptr<rgw::sal::RGWRole> role = driver. get_role (entry);
434424 int ret = role->read_info (dpp, y);
435425 if (ret < 0 ) {
436426 return ret;
@@ -445,13 +435,31 @@ int RGWRoleMetadataHandler::do_get(RGWSI_MetaBackend_Handler::Op *op,
445435 return 0 ;
446436}
447437
448- int RGWRoleMetadataHandler::do_remove (RGWSI_MetaBackend_Handler::Op *op,
449- std::string& entry,
450- RGWObjVersionTracker& objv_tracker,
451- optional_yield y,
452- const DoutPrefixProvider *dpp)
438+ int RGWRoleMetadataHandler::put (std::string& entry, RGWMetadataObject *obj,
439+ RGWObjVersionTracker& objv_tracker,
440+ optional_yield y, const DoutPrefixProvider *dpp,
441+ RGWMDLogSyncType type, bool from_remote_zone)
442+ {
443+ auto robj = static_cast <RGWRoleMetadataObject*>(obj);
444+ auto & info = robj->get_role_info ();
445+ auto mtime = robj->get_mtime ();
446+ info.mtime = mtime;
447+
448+ std::unique_ptr<rgw::sal::RGWRole> role = driver.get_role (info);
449+ int ret = role->create (dpp, true , info.id , y);
450+ if (ret == -EEXIST) {
451+ ret = role->update (dpp, y);
452+ }
453+
454+ return ret < 0 ? ret : STATUS_APPLIED;
455+ }
456+
457+ int RGWRoleMetadataHandler::remove (std::string& entry,
458+ RGWObjVersionTracker& objv_tracker,
459+ optional_yield y,
460+ const DoutPrefixProvider *dpp)
453461{
454- std::unique_ptr<rgw::sal::RGWRole> role = driver-> get_role (entry);
462+ std::unique_ptr<rgw::sal::RGWRole> role = driver. get_role (entry);
455463 int ret = role->read_info (dpp, y);
456464 if (ret < 0 ) {
457465 return ret == -ENOENT? 0 : ret;
@@ -460,57 +468,69 @@ int RGWRoleMetadataHandler::do_remove(RGWSI_MetaBackend_Handler::Op *op,
460468 return role->delete_obj (dpp, y);
461469}
462470
463- class RGWMetadataHandlerPut_Role : public RGWMetadataHandlerPut_SObj
471+ int RGWRoleMetadataHandler::mutate (const std::string& entry, const ceph::real_time& mtime,
472+ RGWObjVersionTracker* objv_tracker, optional_yield y,
473+ const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
474+ std::function<int ()> f)
464475{
465- rgw::sal::Driver* driver;
466- RGWRoleMetadataHandler *rhandler;
467- RGWRoleMetadataObject *mdo;
468- public:
469- RGWMetadataHandlerPut_Role (rgw::sal::Driver* driver,
470- RGWRoleMetadataHandler *handler,
471- RGWSI_MetaBackend_Handler::Op *op,
472- std::string& entry,
473- RGWMetadataObject *obj,
474- RGWObjVersionTracker& objv_tracker,
475- optional_yield y,
476- RGWMDLogSyncType type,
477- bool from_remote_zone) :
478- RGWMetadataHandlerPut_SObj (handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
479- driver (driver), rhandler(handler) {
480- mdo = static_cast <RGWRoleMetadataObject*>(obj);
481- }
482-
483- int put_checked (const DoutPrefixProvider *dpp) override {
484- auto & info = mdo->get_role_info ();
485- auto mtime = mdo->get_mtime ();
486- info.mtime = mtime;
487- std::unique_ptr<rgw::sal::RGWRole> role = driver->get_role (info);
488- constexpr bool exclusive = false ;
489- int ret = role->create (dpp, exclusive, info.id , y);
490- if (ret == -EEXIST) {
491- ret = role->update (dpp, y);
492- }
476+ return -ENOTSUP; // unused
477+ }
493478
494- return ret < 0 ? ret : STATUS_APPLIED;
479+ class RoleLister : public RGWMetadataLister {
480+ public:
481+ using RGWMetadataLister::RGWMetadataLister;
482+
483+ virtual void filter_transform (std::vector<std::string>& oids,
484+ std::list<std::string>& keys) {
485+ // remove the oid prefix from keys
486+ constexpr auto trim = [] (const std::string& oid) {
487+ return oid.substr (rgw::sal::RGWRole::role_oid_prefix.size ());
488+ };
489+ std::transform (oids.begin (), oids.end (),
490+ std::back_inserter (keys),
491+ trim);
495492 }
496493};
497494
498- int RGWRoleMetadataHandler::do_put (RGWSI_MetaBackend_Handler::Op *op,
499- std::string& entry,
500- RGWMetadataObject *obj,
501- RGWObjVersionTracker& objv_tracker,
502- optional_yield y,
503- const DoutPrefixProvider *dpp,
504- RGWMDLogSyncType type,
505- bool from_remote_zone)
495+ int RGWRoleMetadataHandler::list_keys_init (const DoutPrefixProvider* dpp,
496+ const std::string& marker,
497+ void ** phandle)
506498{
507- RGWMetadataHandlerPut_Role put_op (driver, this , op , entry, obj, objv_tracker, y, type, from_remote_zone);
508- return do_put_operate (&put_op, dpp);
499+ auto svc_zone = sysobj.get_zone_svc ();
500+ const auto & pool = svc_zone->get_zone_params ().roles_pool ;
501+ auto lister = std::make_unique<RoleLister>(sysobj.get_pool (pool));
502+ int ret = lister->init (dpp, marker, rgw::sal::RGWRole::role_oid_prefix);
503+ if (ret < 0 ) {
504+ return ret;
505+ }
506+ *phandle = lister.release (); // release ownership
507+ return 0 ;
509508}
510509
511- auto create_role_metadata_handler (rgw::sal::Driver* driver,
512- RGWSI_Role_RADOS *role_svc)
510+ int RGWRoleMetadataHandler::list_keys_next (const DoutPrefixProvider* dpp,
511+ void * handle, int max,
512+ std::list<std::string>& keys,
513+ bool * truncated)
514+ {
515+ auto lister = static_cast <RGWMetadataLister*>(handle);
516+ return lister->get_next (dpp, max, keys, truncated);
517+ }
518+
519+ void RGWRoleMetadataHandler::list_keys_complete (void *handle)
520+ {
521+ delete static_cast <RGWMetadataLister*>(handle);
522+ }
523+
524+ std::string RGWRoleMetadataHandler::get_marker (void *handle)
525+ {
526+ auto lister = static_cast <RGWMetadataLister*>(handle);
527+ return lister->get_marker ();
528+ }
529+
530+
531+ auto create_role_metadata_handler (rgw::sal::Driver& driver,
532+ RGWSI_SysObj& sysobj)
513533 -> std::unique_ptr<RGWMetadataHandler>
514534{
515- return std::make_unique<RGWRoleMetadataHandler>(driver, role_svc );
535+ return std::make_unique<RGWRoleMetadataHandler>(driver, sysobj );
516536}
0 commit comments