real_time mtime;
map<string, bufferlist> attrs;
- string tenant_name, bucket_name;
- parse_bucket(entry, &tenant_name, &bucket_name);
int ret = read_bucket_entrypoint_info(ctx, entry, &be, &ot, &mtime, &attrs);
if (ret < 0)
return ret;
int RGWMetadataHandler::get(string& entry, RGWMetadataObject **obj)
{
RGWSI_Meta_Ctx ctx;
+ init_ctx(be_handle, entry, nullptr, &ctx);
return do_get(ctx.get(), entry, obj);
}
int RGWMetadataHandler::put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, RGWMDLogSyncType type)
{
RGWSI_Meta_Ctx ctx;
+ init_ctx(be_handle, entry, obj, &ctx);
return do_put(ctx.get(), entry, obj, objv_tracker, type);
}
int RGWMetadataHandler::remove(string& entry, RGWObjVersionTracker& objv_tracker)
{
RGWSI_Meta_Ctx ctx;
+ init_ctx(be_handle, entry, nullptr, &ctx);
return do_remove(ctx.get(), entry, objv_tracker);
}
static RGWMetadataHandler *otp_meta_handler = NULL;
+class RGWOTPMetadataHandler;
+
class RGWOTPMetadataObject : public RGWMetadataObject {
- list<rados::cls::otp::otp_info_t> result;
+ friend class RGWOTPMetadataHandler;
+
+ list<rados::cls::otp::otp_info_t> devices;
public:
- RGWOTPMetadataObject(list<rados::cls::otp::otp_info_t>& _result, obj_version& v, real_time m) {
- result.swap(_result);
+ RGWOTPMetadataObject() {}
+ RGWOTPMetadataObject(list<rados::cls::otp::otp_info_t>& _devices, obj_version& v, real_time m) {
+ devices.swap(_devices);
objv = v;
mtime = m;
}
void dump(Formatter *f) const override {
- encode_json("devices", result, f);
+ encode_json("devices", devices, f);
+ }
+
+ list<rados::cls::otp::otp_info_t>& get_devs() {
+ return devices;
}
};
-class RGWOTPMetadataHandler : public RGWMetadataHandler {
- struct Svc {
- RGWSI_MetaBackend *meta_be;
- };
+class RGW_MB_Handler_Module_OTP : public RGWSI_MBSObj_Handler_Module {
+ RGWSI_Zone *zone_svc;
+public:
+ RGW_MB_Handler_Module_OTP(RGWSI_Zone *_zone_svc) : zone_svc {}
void get_pool_and_oid(RGWRados *store, const string& key, rgw_pool& pool, string& oid) override {
oid = key;
pool = store->svc.zone->get_zone_params().otp_pool;
}
+};
+
+class RGWOTPMetadataHandler : public RGWMetadataHandler {
+ int init_module() override {
+ be_module.reset(new RGW_MB_Handler_Module_OTP(store->svc.zone));
+ return 0;
+ }
+
+ RGWSI_MetaBackend::Type required_be_type() override {
+ return MDBE_OTP;
+ }
int do_get(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject **obj) override {
RGWObjVersionTracker objv_tracker;
real_time mtime;
- list<rados::cls::otp::otp_info_t> result;
- int r = svc.cls->mfa.list_mfa(entry, &result, &objv_tracker, &mtime, null_yield);
- if (r < 0) {
- return r;
+ RGWOTPMetadataObject *mdo = new RGWOTPMetadataObject;
+
+ ctx->obj = mdo;
+
+ int ret = meta_be->get_entry(ctx, nullptr,
+ objv_tracker, &mdo->mtime,
+ nullptr,
+ nullptr, nullopt);
+ if (ret < 0) {
+ return ret;
}
- RGWOTPMetadataObject *mdo = new RGWOTPMetadataObject(result, objv_tracker.read_version, mtime);
+
+ mdo->read_version = objv_tracker.read_version;
+
*obj = mdo;
+
return 0;
}
- int do_put(RGWSI_MetaBackend::Context *ctx, string& entry, RGWObjVersionTracker& objv_tracker,
- real_time mtime, JSONObj *obj, RGWMDLogSyncType sync_mode) override {
+ int do_put(RGWSI_MetaBackend::Context *ctx, string& entry,
+ RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
+ RGWMDLogSyncType type) override {
+ RGWOTPMetadataObject *obj = static_cast<RGWOTPMetadataObject *>(_obj);
- list<rados::cls::otp::otp_info_t> devices;
- try {
- JSONDecoder::decode_json("devices", devices, obj);
- } catch (JSONDecoder::err& e) {
- return -EINVAL;
- }
+ ctx->obj = obj;
- int ret = svc.meta_be->mutate(ctx, entry, mtime, &objv_tracker,
- MDLOG_STATUS_WRITE, sync_mode,
- [&] {
- return svc.cls->mfa.set_mfa(entry, devices, true, &objv_tracker, mtime, null_yield);
- });
+ bufferlist bl;
+ int ret = meta_be->put(ctx, bl,
+ false, objv_tracker,
+ obj->mtime, pattrs,
+ APPLY_ALWAYS);
if (ret < 0) {
return ret;
}
enum Type {
MDBE_SOBJ = 0,
+ MDBE_OTP = 1,
};
RGWSI_MetaBackend(CephContext *cct) : RGWServiceInstance(cct) {}
virtual Type get_type() = 0;
- virtual void init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, Context *ctx) = 0;
+ virtual void init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, RGWMetadataObject *obj, Context *ctx) = 0;
/* these should be implemented by backends */
virtual int get_entry(Context *ctx,
#define dout_subsys ceph_subsys_rgw
-struct rgwsi_meta_be_sobj_handler_info {
- RGWSI_MetaBackend::ModuleRef _module;
- RGWSI_MBSObj_Handler_Module *module;
- string section;
-};
-
RGWSI_MetaBackend_SObj::RGWSI_MetaBackend_SObj(CephContext *cct) : RGWSI_MetaBackend(cct) {
}
return 0;
}
-void RGWSI_MetaBackend_SObj::init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, RGWSI_MetaBackend::Context *_ctx)
+void RGWSI_MetaBackend_SObj::init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, RGWMetadataObject *obj, RGWSI_MetaBackend::Context *_ctx)
{
RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
rgwsi_meta_be_sobj_handler_info *h = static_cast<rgwsi_meta_be_sobj_handler_info *>(handle);
ctx->module = h->module;
ctx->section = h->section;
ctx->key = key;
+ ctx->obj = obj;
ctx->obj_ctx.emplace(sysobj_svc->init_obj_ctx());
static_cast<RGWSI_MBSObj_Handler_Module *>(ctx->module)->get_pool_and_oid(key, ctx->pool, ctx->oid);
}
#include "svc_sys_obj.h"
-struct rgwsi_meta_be_sobj_handler_info;
+class RGWSI_MBSObj_Handler_Module;
+
+struct rgwsi_meta_be_sobj_handler_info {
+ RGWSI_MetaBackend::ModuleRef _module;
+ RGWSI_MBSObj_Handler_Module *module;
+ string section;
+};
+
class RGWSI_MBSObj_Handler_Module : public RGWSI_MetaBackend::Module {
public:
class RGWSI_MetaBackend_SObj : public RGWSI_MetaBackend
{
+protected:
RGWSI_SysObj *sysobj_svc{nullptr};
map<string, rgwsi_meta_be_sobj_handler_info> handlers;
-protected:
int init_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handle *phandle) override;
public:
struct Context_SObj : public RGWSI_MetaBackend::Context {
std::optional<RGWSysObjectCtx> obj_ctx;
+ RGWMetadataObject *obj;
rgw_pool pool;
string oid;
};
sysobj_svc = _sysobj_svc;
}
- void init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, RGWSI_MetaBackend::Context *ctx) override;
+ void init_ctx(RGWSI_MetaBackend_Handle handle, const string& key, RGWMetadataObject *obj, RGWSI_MetaBackend::Context *ctx) override;
virtual int get_entry(RGWSI_MetaBackend::Context *ctx,
bufferlist *pbl,
real_time *pmtime,
map<string, bufferlist> *pattrs = nullptr,
rgw_cache_entry_info *cache_info = nullptr,
- boost::optional<obj_version> refresh_version = boost::none);
+ boost::optional<obj_version> refresh_version = boost::none) override;
virtual int put_entry(RGWSI_MetaBackend::Context *ctx, bufferlist& bl, bool exclusive,
- RGWObjVersionTracker *objv_tracker, real_time mtime, map<string, bufferlist> *pattrs = nullptr);
+ RGWObjVersionTracker *objv_tracker, real_time mtime, map<string, bufferlist> *pattrs = nullptr) override;
virtual int remove_entry(RGWSI_MetaBackend::Context *ctx,
- RGWObjVersionTracker *objv_tracker);
+ RGWObjVersionTracker *objv_tracker) override;
};