Skip to content

Commit 4ed934a

Browse files
committed
rgw/metadata: use raw RGWMetadataHandler for role metadata
Signed-off-by: Casey Bodley <[email protected]>
1 parent 78bbf69 commit 4ed934a

File tree

3 files changed

+112
-92
lines changed

3 files changed

+112
-92
lines changed

src/rgw/driver/rados/rgw_service.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
385385

386386
meta.otp = rgwrados::otp::create_metadata_handler(
387387
*svc.sysobj, *svc.cls, *svc.mdlog, svc.zone->get_zone_params());
388-
meta.role = create_role_metadata_handler(driver, svc.role);
388+
meta.role = create_role_metadata_handler(*driver, *svc.sysobj);
389389
meta.account = rgwrados::account::create_metadata_handler(
390390
*svc.sysobj, svc.zone->get_zone_params());
391391
meta.group = rgwrados::group::create_metadata_handler(

src/rgw/rgw_role.cc

Lines changed: 108 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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-
412405
RGWMetadataObject *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
}

src/rgw/rgw_role.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ class RGWRole
168168

169169

170170
class RGWMetadataHandler;
171-
class RGWSI_Role_RADOS;
171+
class RGWSI_SysObj;
172172

173-
auto create_role_metadata_handler(rgw::sal::Driver* driver,
174-
RGWSI_Role_RADOS *role_svc)
173+
auto create_role_metadata_handler(rgw::sal::Driver& driver,
174+
RGWSI_SysObj& sysobj)
175175
-> std::unique_ptr<RGWMetadataHandler>;

0 commit comments

Comments
 (0)