]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: start adapting otp metadata handler
authorYehuda Sadeh <yehuda@redhat.com>
Sat, 16 Mar 2019 02:01:51 +0000 (19:01 -0700)
committerCasey Bodley <cbodley@redhat.com>
Mon, 29 Jul 2019 19:20:46 +0000 (15:20 -0400)
and other changes

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_metadata.cc
src/rgw/rgw_otp.cc
src/rgw/services/svc_meta_be.h
src/rgw/services/svc_meta_be_sobj.cc
src/rgw/services/svc_meta_be_sobj.h

index 6cc1f571f8c1c71bb4bd6d52c6c826d9cd3ec61c..d8a251dcdc8ae9982559ab0c9fdbe96b23a35307 100644 (file)
@@ -2633,8 +2633,6 @@ public:
     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;
index 9673528a7f3728719ad2fc5ced831c3f2d149a80..0175b9b41526ba9e5e6a9a1eae1538294f0a45ab 100644 (file)
@@ -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);
 }
 
index a0bf6a29190bcc1889c3343b012bd0ae7643f819..4a0a2586ebff6746553cb8f2193f6627c15aefdb 100644 (file)
@@ -30,59 +30,85 @@ using namespace std;
 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;
     }
index 4b223c3682c83700e41f60dce708310e48fed898..8cddeb0f77c921062ffe03683aafca898fc6410f 100644 (file)
@@ -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,
index f76e8c0ae6d74d3bcf54089dfe528cd51275514c..466cd765ef171019cf752c823faf26c578f64e57 100644 (file)
@@ -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<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
   rgwsi_meta_be_sobj_handler_info *h = static_cast<rgwsi_meta_be_sobj_handler_info *>(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<RGWSI_MBSObj_Handler_Module *>(ctx->module)->get_pool_and_oid(key, ctx->pool, ctx->oid);
 }
index 222ef2cf32835e757b21d8bb694524ef786277fc..6fdb9cd12c307f00a6144bb192ff21b4694b1dd9 100644 (file)
 #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<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;
   };
@@ -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<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;
 };