From 109b6d189d09f76dfc632214c433d2773ef56ce1 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 15 Mar 2019 19:01:51 -0700 Subject: [PATCH] rgw: start adapting otp metadata handler and other changes Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_bucket.cc | 2 - src/rgw/rgw_metadata.cc | 3 ++ src/rgw/rgw_otp.cc | 78 ++++++++++++++++++---------- src/rgw/services/svc_meta_be.h | 3 +- src/rgw/services/svc_meta_be_sobj.cc | 9 +--- src/rgw/services/svc_meta_be_sobj.h | 20 ++++--- 6 files changed, 73 insertions(+), 42 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 6cc1f571f8c..d8a251dcdc8 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -2633,8 +2633,6 @@ public: real_time mtime; map 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; diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 9673528a7f3..0175b9b4152 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -392,18 +392,21 @@ int RGWMetadataHandler::init(RGWMetadataManager *manager) 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); } diff --git a/src/rgw/rgw_otp.cc b/src/rgw/rgw_otp.cc index a0bf6a29190..4a0a2586ebf 100644 --- a/src/rgw/rgw_otp.cc +++ b/src/rgw/rgw_otp.cc @@ -30,59 +30,85 @@ using namespace std; static RGWMetadataHandler *otp_meta_handler = NULL; +class RGWOTPMetadataHandler; + class RGWOTPMetadataObject : public RGWMetadataObject { - list result; + friend class RGWOTPMetadataHandler; + + list devices; public: - RGWOTPMetadataObject(list& _result, obj_version& v, real_time m) { - result.swap(_result); + RGWOTPMetadataObject() {} + RGWOTPMetadataObject(list& _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& 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 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(_obj); - list 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; } diff --git a/src/rgw/services/svc_meta_be.h b/src/rgw/services/svc_meta_be.h index 4b223c3682c..8cddeb0f77c 100644 --- a/src/rgw/services/svc_meta_be.h +++ b/src/rgw/services/svc_meta_be.h @@ -96,6 +96,7 @@ public: enum Type { MDBE_SOBJ = 0, + MDBE_OTP = 1, }; RGWSI_MetaBackend(CephContext *cct) : RGWServiceInstance(cct) {} @@ -103,7 +104,7 @@ public: 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, diff --git a/src/rgw/services/svc_meta_be_sobj.cc b/src/rgw/services/svc_meta_be_sobj.cc index f76e8c0ae6d..466cd765ef1 100644 --- a/src/rgw/services/svc_meta_be_sobj.cc +++ b/src/rgw/services/svc_meta_be_sobj.cc @@ -8,12 +8,6 @@ #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) { } @@ -34,7 +28,7 @@ int RGWSI_MetaBackend_SObj::init_handler(RGWMetadataHandler *handler, RGWSI_Meta 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(_ctx); rgwsi_meta_be_sobj_handler_info *h = static_cast(handle); @@ -43,6 +37,7 @@ void RGWSI_MetaBackend_SObj::init_ctx(RGWSI_MetaBackend_Handle handle, const str 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(ctx->module)->get_pool_and_oid(key, ctx->pool, ctx->oid); } diff --git a/src/rgw/services/svc_meta_be_sobj.h b/src/rgw/services/svc_meta_be_sobj.h index 222ef2cf328..6fdb9cd12c3 100644 --- a/src/rgw/services/svc_meta_be_sobj.h +++ b/src/rgw/services/svc_meta_be_sobj.h @@ -24,7 +24,14 @@ #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: @@ -36,16 +43,17 @@ public: class RGWSI_MetaBackend_SObj : public RGWSI_MetaBackend { +protected: RGWSI_SysObj *sysobj_svc{nullptr}; map handlers; -protected: int init_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handle *phandle) override; public: struct Context_SObj : public RGWSI_MetaBackend::Context { std::optional obj_ctx; + RGWMetadataObject *obj; rgw_pool pool; string oid; }; @@ -63,7 +71,7 @@ public: 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, @@ -71,11 +79,11 @@ public: real_time *pmtime, map *pattrs = nullptr, rgw_cache_entry_info *cache_info = nullptr, - boost::optional refresh_version = boost::none); + boost::optional refresh_version = boost::none) override; virtual int put_entry(RGWSI_MetaBackend::Context *ctx, bufferlist& bl, bool exclusive, - RGWObjVersionTracker *objv_tracker, real_time mtime, map *pattrs = nullptr); + RGWObjVersionTracker *objv_tracker, real_time mtime, map *pattrs = nullptr) override; virtual int remove_entry(RGWSI_MetaBackend::Context *ctx, - RGWObjVersionTracker *objv_tracker); + RGWObjVersionTracker *objv_tracker) override; }; -- 2.39.5