]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: meta_be: provide a backend handler
authorYehuda Sadeh <yehuda@redhat.com>
Sat, 27 Apr 2019 02:51:10 +0000 (19:51 -0700)
committerCasey Bodley <cbodley@redhat.com>
Mon, 29 Jul 2019 19:20:47 +0000 (15:20 -0400)
RGW_MetaBackend_Handler can create a backend context. It is created
for each backend user (meta handler).

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

index 16c8ca88504ae83c1b8bb73d2060fa2f91a42e9f..5459058d23ad4c28c4f4c91336342969f8162168 100644 (file)
@@ -286,13 +286,6 @@ class RGWMetadataTopHandler : public RGWMetadataHandler {
     set<string>::iterator iter;
   };
 
-  class HandlerModule : public RGWSI_MetaBackend::Module {
-  public:
-    void get_pool_and_oid(const string& key, rgw_pool& pool, string& oid) {}
-    void key_to_oid(string& key) {}
-    void oid_to_key(string& oid) {}
-  };
-
   struct Svc {
     RGWSI_Meta *meta{nullptr};
   } svc;
@@ -313,10 +306,10 @@ public:
     return new RGWMetadataObject;
   }
 
-  int do_get(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject **obj, optional_yield y) override { return -ENOTSUP; }
-  int do_put(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject *obj,
+  int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y) override { return -ENOTSUP; }
+  int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject *obj,
              RGWObjVersionTracker& objv_tracker, optional_yield y, RGWMDLogSyncType type) override { return -ENOTSUP; }
-  int do_remove(RGWSI_MetaBackend::Context *ctx, string& entry, RGWObjVersionTracker& objv_tracker, optional_yield y) override { return -ENOTSUP; }
+  int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker, optional_yield y) override { return -ENOTSUP; }
 
   int list_keys_init(const string& marker, void **phandle) override {
     iter_data *data = new iter_data;
@@ -377,15 +370,15 @@ RGWMetadataManager::~RGWMetadataManager()
 
 int RGWMetadataHandler::init(RGWMetadataManager *manager)
 {
-  int r = init_module();
+  int r = init_handler();
   if (r < 0) {
     return r;
   }
 
-  return manager->register_handler(this, &meta_be, &be_handle);
+  return manager->register_handler(this);
 }
 
-RGWMetadataHandler::Put::Put(RGWMetadataHandler *handler, RGWSI_MetaBackend::Context *_ctx,
+RGWMetadataHandler::Put::Put(RGWMetadataHandler *handler,
                              string& _entry, RGWMetadataObject *_obj,
                              RGWObjVersionTracker& _objv_tracker,
                              optional_yield _y,
@@ -394,7 +387,7 @@ RGWMetadataHandler::Put::Put(RGWMetadataHandler *handler, RGWSI_MetaBackend::Con
   obj(_obj), objv_tracker(_objv_tracker),
   apply_type(_type), y(_y)
 {
-  meta_be = handler->get_meta_be();
+  meta_be = handler->meta_be;
 }
 
 int RGWMetadataHandlerPut_SObj::put()
@@ -460,49 +453,34 @@ int RGWMetadataHandler::do_put_operate(Put *put_op)
   return 0;
 }
 
-int RGWMetadataHandler::call_with_ctx(std::function<int(RGWSI_MetaBackend::Context *ctx)> f)
-{
-  RGWSI_Meta_Ctx ctx;
-  meta_be->init_ctx(be_handle, &ctx);
-  return f(ctx.get());
-}
-
-int RGWMetadataHandler::call_with_ctx(const string& entry, std::function<int(RGWSI_MetaBackend::Context *ctx)> f)
+int RGWMetadataHandler::get(string& entry, RGWMetadataObject **obj)
 {
-  RGWSI_Meta_Ctx ctx;
-  meta_be->init_ctx(be_handle, &ctx);
-  ctx->set_key(entry);
-  return f(ctx.get());
-}
-
-int RGWMetadataHandler::get(string& entry, RGWMetadataObject **obj, optional_yield y)
-{
-  return call_with_ctx(entry, [&](RGWSI_MetaBackend::Context *ctx) {
-    return do_get(ctx, entry, obj, y);
+  return meta_be->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return do_get(op, entry, obj, y);
   });
 }
 
 int RGWMetadataHandler::put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
                             optional_yield y, RGWMDLogSyncType type)
 {
-  return call_with_ctx(entry, [&](RGWSI_MetaBackend::Context *ctx) {
-    return do_put(ctx, entry, obj, objv_tracker, y, type);
+  return meta_be->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return do_put(op, entry, obj, objv_tracker, y, type);
   });
 }
 
 int RGWMetadataHandler::remove(string& entry, RGWObjVersionTracker& objv_tracker, optional_yield y)
 {
-  return call_with_ctx(entry, [&](RGWSI_MetaBackend::Context *ctx) {
-    return do_remove(ctx, entry, objv_tracker, y);
+  return handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return do_remove(op, entry, objv_tracker, y);
   });
 }
 
-int RGWMetadataManager::register_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend **pmeta_be, RGWSI_MetaBackend_Handle *phandle)
+int RGWMetadataManager::register_handler(RGWMetadataHandler *handler)
 {
   string type = handler->get_type();
 
   if (handlers.find(type) != handlers.end())
-    return -EINVAL;
+    return -EEXIST;
 
   int ret = meta_svc->init_handler(handler, pmeta_be, phandle);
   if (ret < 0) {
index 80ed6c445161ee2bd6f30c7c447c6ad7a60c45f8..5c92f1d7d5216dd01f80ea71a955cb7fb1fccd5e 100644 (file)
@@ -57,12 +57,13 @@ class RGWMetadataHandler {
   friend class RGWMetadataManager;
   friend class Put;
 
+protected:
+  RGWSI_MetaBackend_Handler *meta_be;
 public:
   class Put {
   protected:
-    RGWSI_MetaBackend *meta_be;
     RGWMetadataHandler *handler;
-    RGWSI_MetaBackend::Context *ctx;
+    RGWSI_MetaBackend_Handler::Op *op;
     string& entry;
     RGWMetadataObject *obj;
     RGWObjVersionTracker& objv_tracker;
@@ -70,10 +71,10 @@ public:
     optional_yield y;
 
     int get(RGWMetadataObject **obj) {
-      return handler->do_get(ctx, entry, obj, y);
+      return handler->do_get(op, entry, obj, y);
     }
   public:
-    Put(RGWMetadataHandler *handler, RGWSI_MetaBackend::Context *_ctx,
+    Put(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handler::Op *_op,
         string& _entry, RGWMetadataObject *_obj,
         RGWObjVersionTracker& _objv_tracker, optional_yield _y,
         RGWMDLogSyncType _type);
@@ -95,33 +96,23 @@ public:
   };
 
 protected:
-  RGWSI_MetaBackend *meta_be{nullptr};
-  RGWSI_MetaBackend_Handle be_handle{0};
-  RGWSI_MetaBackend::ModuleRef be_module;
+  virtual int init_handler() {
+    return 0;
+  }
 
-  virtual int do_get(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject **obj,
-                     optional_yield y) = 0;
-  virtual int do_put(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject *obj,
-                     RGWObjVersionTracker& objv_tracker, RGWMDLogSyncType type,
+  virtual int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj,
                      optional_yield y) = 0;
+  virtual int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject *obj,
+                     RGWObjVersionTracker& objv_tracker,
+                     optional_yield y, RGWMDLogSyncType type) = 0;
   virtual int do_put_operate(Put *put_op);
-  virtual int do_remove(RGWSI_MetaBackend::Context *ctx, string& entry, RGWObjVersionTracker& objv_tracker,
+  virtual int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
                         optional_yield y) = 0;
 
-  virtual int init_module() = 0;
-
 public:
   virtual ~RGWMetadataHandler() {}
   virtual string get_type() = 0;
 
-  virtual RGWSI_MetaBackend::ModuleRef& get_be_module() {
-    return be_module;
-  }
-
-  RGWSI_MetaBackend  *get_meta_be() {
-    return meta_be;
-  }
-
   virtual RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) = 0;
 
   int get(string& entry, RGWMetadataObject **obj, optional_yield y);
@@ -134,7 +125,7 @@ public:
 
   virtual string get_marker(void *handle) = 0;
 
-  int init(RGWMetadataManager *manager);
+  virtual int init(RGWMetadataManager *manager);
 
   /**
    * Compare an incoming versus on-disk tag/version+mtime combo against
@@ -165,10 +156,6 @@ public:
     }
     return true;
   }
-
-  int call_with_ctx(std::function<int(RGWSI_MetaBackend::Context *ctx)> f);
-  int call_with_ctx(const string& entry, std::function<int(RGWSI_MetaBackend::Context *ctx)> f);
-
 };
 
 class RGWMetadataTopHandler;
@@ -182,10 +169,8 @@ class RGWMetadataManager {
   std::unique_ptr<RGWMetadataTopHandler> md_top_handler;
 
   int find_handler(const string& metadata_key, RGWMetadataHandler **handler, string& entry);
-  int register_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend **pmeta_be, RGWSI_MetaBackend_Handle *phandle);
+  int register_handler(RGWMetadataHandler *handler);
 
-protected:
-  int call_with_ctx(const string& entry, RGWMetadataObject *obj, std::function<int(RGWSI_MetaBackend::Context *ctx)> f);
 public:
   RGWMetadataManager(RGWSI_Meta *_meta_svc);
   ~RGWMetadataManager();
@@ -217,9 +202,9 @@ public:
 class RGWMetadataHandlerPut_SObj : public RGWMetadataHandler::Put
 {
 public:
-  RGWMetadataHandlerPut_SObj(RGWMetadataHandler *handler, RGWSI_MetaBackend::Context *ctx,
+  RGWMetadataHandlerPut_SObj(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handler::Op *op,
                              string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
-                             RGWMDLogSyncType type) : Put(handler, ctx, entry, obj, objv_tracker, type) {}
+                             RGWMDLogSyncType type) : Put(handler, op, entry, obj, objv_tracker, type) {}
   ~RGWMetadataHandlerPut_SObj() {}
 
   int put() override;
index 4a6dbbb4524ab4068664f9895c25350eb026fb2d..a568576e5dc75f270946d03ba9934e4330bdf175 100644 (file)
@@ -2022,7 +2022,7 @@ int RGWUser::list(RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher)
     op_state.max_entries = 1000;
   }
 
-  auto meta_mgr = store->svc.meta->get_mgr();
+  auto meta_mgr = store->ctl.meta.mgr;
 
   int ret = meta_mgr->list_keys_init(metadata_key, op_state.marker, &handle);
   if (ret < 0) {
@@ -2422,6 +2422,7 @@ int RGWUserAdminOp_Caps::remove(RGWRados *store, RGWUserAdminOpState& op_state,
 }
 
 class RGWUserMetadataHandler : public RGWMetadataHandler {
+  RGWSI_MetaBackend_Handler *be_handler{nullptr};
 public:
   struct Svc {
     RGWSI_User *user{nullptr};
@@ -2429,16 +2430,23 @@ public:
 
   RGWUserMetadataHandler(RGWSI_User *user_svc) {
     svc.user = user_svc;
+    be_handler = svc.user->get_be_handler();
+  }
+
+  RGWSI_MetaBackend_Handler *get_be_handler() {
+    return be_handler;
   }
 
   string get_type() override { return "user"; }
 
-  int do_get(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject **obj, optional_yield y) override {
+  int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y) override {
     RGWUserCompleteInfo uci;
     RGWObjVersionTracker objv_tracker;
     real_time mtime;
 
-    int ret = svc.user->read_user_info(ctx, &uci.info, &objv_tracker,
+    rgw_user user = RGWSI_User::user_from_meta_key(entry);
+
+    int ret = svc.user->read_user_info(op->ctx(), user, &uci.info, &objv_tracker,
                                        &mtime, nullptr, &uci.attrs,
                                        y);
     if (ret < 0) {
@@ -2463,7 +2471,7 @@ public:
     return new RGWUserMetadataObject(uci, objv, mtime);
   }
 
-  int do_put(RGWSI_MetaBackend::Context *ctx, string& entry,
+  int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
              RGWMetadataObject *obj,
              RGWObjVersionTracker& objv_tracker,
              optional_yield y,
@@ -2474,18 +2482,20 @@ public:
     RGWListRawObjsCtx ctx;
   };
 
-  int do_remove(RGWSI_MetaBackend::Context *ctx, string& entry, RGWObjVersionTracker& objv_tracker,
+  int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
                 optional_yield y) {
     RGWUserInfo info;
 
-    int ret = svc.user->read_user_info(ctx, &info, nullptr,
+    rgw_user user = RGWSI_User::user_from_meta_key(entry);
+
+    int ret = svc.user->read_user_info(op->ctx(), user, &info, nullptr,
                                        nullptr, nullptr, nullptr,
                                        y);
     if (ret < 0) {
       return ret;
     }
 
-    return svc.user->remove_user_info(ctx, info, &objv_tracker,
+    return svc.user->remove_user_info(op->ctx(), info, &objv_tracker,
                                       y);
   }
 
@@ -2557,25 +2567,25 @@ class RGWMetadataHandlerPut_User : public RGWMetadataHandlerPut_SObj
   RGWUserMetadataObject *uobj;
 public:
   RGWMetadataHandlerPut_User(RGWUserMetadataHandler *_handler,
-                             RGWSI_MetaBackend::Context *ctx, string& entry,
+                             RGWSI_MetaBackend_Handler::Op *op, string& entry,
                              RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
                              optional_yield y,
-                             RGWMDLogSyncType type) : RGWMetadataHandlerPut_SObj(handler, ctx, entry, obj, objv_tracker, y, type),
-                                                                handler(_handler) {
+                             RGWMDLogSyncType type) : RGWMetadataHandlerPut_SObj(handler, op, entry, obj, objv_tracker, y, type),
+                                                      handler(_handler) {
     uobj = static_cast<RGWUserMetadataObject *>(obj);
   }
 
   int put_checked(RGWMetadataObject *_old_obj) override;
 };
 
-int RGWUserMetadataHandler::do_put(RGWSI_MetaBackend::Context *ctx, string& entry,
+int RGWUserMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
                                    RGWMetadataObject *obj,
                                    RGWObjVersionTracker& objv_tracker,
                                    optional_yield y,
                                    RGWMDLogSyncType type)
 {
-  RGWMetadataHandlerPut_User op(this, ctx, entry, obj, objv_tracker, y, type);
-  return do_put_operate(&op);
+  RGWMetadataHandlerPut_User put_op(this, op, entry, obj, objv_tracker, y, type);
+  return do_put_operate(&put_op);
 }
 
 int RGWMetadataHandlerPut_User::put_checked(RGWMetadataObject *_old_obj)
@@ -2592,7 +2602,7 @@ int RGWMetadataHandlerPut_User::put_checked(RGWMetadataObject *_old_obj)
 
   auto mtime = obj->get_mtime();
 
-  int ret = handler->svc.user->store_user_info(ctx, uci.info, pold_info,
+  int ret = handler->svc.user->store_user_info(op->ctx(), uci.info, pold_info,
                                                &objv_tracker, mtime,
                                                false, pattrs, y);
   if (ret < 0) {
@@ -2603,13 +2613,20 @@ int RGWMetadataHandlerPut_User::put_checked(RGWMetadataObject *_old_obj)
 }
 
 
+RGWUserCtl::RGWUserCtl(RGWSI_Zone *zone_svc,
+                       RGWSI_User *user_svc,
+                       RGWUserMetadataHandler *_umhandler) : umhandler(_umhandler) {
+  svc.zone = zone_svc;
+  svc.user = user_svc;
+  be_handler = umhandler->get_be_handler();
+}
+
 int RGWUserCtl::get_info_by_uid(const rgw_user& uid, GetParams& params)
 
 {
-  string key = RGWSI_User::get_meta_key(uid);
-
-  return umhandler->call_with_ctx(key, [&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->read_user_info(ctx,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->read_user_info(op->ctx(),
+                                    uid,
                                     params.info,
                                     params.objv_tracker,
                                     params.mtime,
@@ -2622,8 +2639,8 @@ int RGWUserCtl::get_info_by_uid(const rgw_user& uid, GetParams& params)
 int RGWUserCtl::get_info_by_email(const string& email, GetParams& params)
 
 {
-  return umhandler->call_with_ctx([&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->get_user_info_by_email(ctx, email,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->get_user_info_by_email(op->ctx(), email,
                                             params.info,
                                             params.objv_tracker,
                                             params.mtime,
@@ -2633,8 +2650,8 @@ int RGWUserCtl::get_info_by_email(const string& email, GetParams& params)
 
 int RGWUserCtl::get_info_by_swift(const string& swift_name, GetParams& params)
 {
-  return umhandler->call_with_ctx([&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->get_user_info_by_swift(ctx, swift_name,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->get_user_info_by_swift(op->ctx(), swift_name,
                                             params.info,
                                             params.objv_tracker,
                                             params.mtime,
@@ -2644,8 +2661,8 @@ int RGWUserCtl::get_info_by_swift(const string& swift_name, GetParams& params)
 
 int RGWUserCtl::get_info_by_access_key(const string& access_key, GetParams& params)
 {
-  return umhandler->call_with_ctx([&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->get_user_info_by_swift(ctx, access_key,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->get_user_info_by_swift(op->ctx(), access_key,
                                             params.info,
                                             params.objv_tracker,
                                             params.mtime,
@@ -2654,12 +2671,11 @@ int RGWUserCtl::get_info_by_access_key(const string& access_key, GetParams& para
 }
 
 int RGWUserCtl::store_info(const RGWUserInfo& info, PutParams& params)
-
 {
   string key = RGWSI_User::get_meta_key(info.user_id);
 
-  return umhandler->call_with_ctx(key, [&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->store_user_info(ctx, info,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->store_user_info(op->ctx(), info,
                                      params.old_info,
                                      params.objv_tracker,
                                      params.mtime,
@@ -2674,8 +2690,8 @@ int RGWUserCtl::remove_info(const RGWUserInfo& info, RemoveParams& params)
 {
   string key = RGWSI_User::get_meta_key(info.user_id);
 
-  return umhandler->call_with_ctx(key, [&](RGWSI_MetaBackend::Context *ctx) {
-    return svc.user->remove_user_info(ctx, info,
+  return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+    return svc.user->remove_user_info(op->ctx(), info,
                                       params.objv_tracker,
                                       params.y);
   });
index 5451c40f0d12b9e29897e812a6bb47ba1dba47fc..84f48364775ad631a31d411f80c7b0dbe8e563fe 100644 (file)
@@ -809,14 +809,12 @@ class RGWUserCtl
   } svc;
 
   RGWUserMetadataHandler *umhandler;
+  RGWSI_MetaBackend_Handler *be_handler;
   
 public:
   RGWUserCtl(RGWSI_Zone *zone_svc,
              RGWSI_User *user_svc,
-             RGWUserMetadataHandler *_umhandler) : umhandler(_umhandler) {
-    svc.zone = zone_svc;
-    svc.user = user_svc;
-  }
+             RGWUserMetadataHandler *_umhandler);
 
   struct GetParams {
     RGWUserInfo *info{nullptr};
index be4990f3b67bf9173b636c09452dbd4acaa523f6..7093c46f7796cf9411d2d6970bebc3fc70065fc8 100644 (file)
@@ -15,6 +15,7 @@ RGWSI_MetaBackend::GetParams::~GetParams() {} // ...
 RGWSI_MetaBackend::RemoveParams::~RemoveParams() {} // ...
 
 int RGWSI_MetaBackend::pre_modify(RGWSI_MetaBackend::Context *ctx,
+                                  const string& key,
                                   RGWMetadataLogData& log_data,
                                   RGWObjVersionTracker *objv_tracker,
                                   RGWMDLogStatus op_type)
@@ -36,7 +37,7 @@ int RGWSI_MetaBackend::pre_modify(RGWSI_MetaBackend::Context *ctx,
   bufferlist logbl;
   encode(log_data, logbl);
 
-  int ret = mdlog_svc->add_entry(ctx->module, ctx->section, ctx->key, logbl);
+  int ret = mdlog_svc->add_entry(ctx->module, ctx->section, key, logbl);
   if (ret < 0)
     return ret;
 
@@ -44,6 +45,7 @@ int RGWSI_MetaBackend::pre_modify(RGWSI_MetaBackend::Context *ctx,
 }
 
 int RGWSI_MetaBackend::post_modify(RGWSI_MetaBackend::Context *ctx,
+                                   const string& key,
                                    RGWMetadataLogData& log_data,
                                    RGWObjVersionTracker *objv_tracker, int ret)
 {
@@ -55,7 +57,7 @@ int RGWSI_MetaBackend::post_modify(RGWSI_MetaBackend::Context *ctx,
   bufferlist logbl;
   encode(log_data, logbl);
 
-  int r = mdlog_svc->add_entry(ctx->module, ctx->section, ctx->key, logbl);
+  int r = mdlog_svc->add_entry(ctx->module, ctx->section, key, logbl);
   if (ret < 0)
     return ret;
 
@@ -66,6 +68,7 @@ int RGWSI_MetaBackend::post_modify(RGWSI_MetaBackend::Context *ctx,
 }
 
 int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context *ctx,
+                                      const string& key,
                                       const real_time& mtime,
                                       RGWObjVersionTracker *objv_tracker,
                                       RGWMDLogSyncType sync_mode)
@@ -73,7 +76,7 @@ int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context *ctx,
   real_time orig_mtime;
   unique_ptr<GetParams> params(alloc_default_get_params(&orig_mtime));
 
-  int ret = get_entry(ctx, *params, objv_tracker);
+  int ret = get_entry(ctx, key, *params, objv_tracker);
   if (ret < 0 && ret != -ENOENT) {
     return ret;
   }
@@ -95,6 +98,7 @@ int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context *ctx,
 }
 
 int RGWSI_MetaBackend::mutate(RGWSI_MetaBackend::Context *ctx,
+                              const string& key,
                               const ceph::real_time& mtime,
                               RGWObjVersionTracker *objv_tracker,
                               RGWMDLogStatus op_type,
@@ -105,7 +109,7 @@ int RGWSI_MetaBackend::mutate(RGWSI_MetaBackend::Context *ctx,
   int ret;
 
   if (generic_prepare) {
-    ret = prepare_mutate(ctx, mtime, objv_tracker, sync_mode);
+    ret = prepare_mutate(ctx, key, mtime, objv_tracker, sync_mode);
     if (ret < 0 ||
         ret == STATUS_NO_APPLY) {
       return ret;
@@ -113,7 +117,7 @@ int RGWSI_MetaBackend::mutate(RGWSI_MetaBackend::Context *ctx,
   }
 
   RGWMetadataLogData log_data;
-  ret = pre_modify(ctx, log_data, objv_tracker, op_type);
+  ret = pre_modify(ctx, key, log_data, objv_tracker, op_type);
   if (ret < 0) {
     return ret;
   }
@@ -122,7 +126,7 @@ int RGWSI_MetaBackend::mutate(RGWSI_MetaBackend::Context *ctx,
 
   /* cascading ret into post_modify() */
 
-  ret = post_modify(ctx, log_data, objv_tracker, ret);
+  ret = post_modify(ctx, key, log_data, objv_tracker, ret);
   if (ret < 0)
     return ret;
 
@@ -130,39 +134,52 @@ int RGWSI_MetaBackend::mutate(RGWSI_MetaBackend::Context *ctx,
 }
 
 int RGWSI_MetaBackend::get(Context *ctx,
+                           const string& key,
                            GetParams& params,
                            RGWObjVersionTracker *objv_tracker)
 {
-  return get_entry(ctx, params, objv_tracker);
+  return get_entry(ctx, key, params, objv_tracker);
 }
 
 int RGWSI_MetaBackend::put(Context *ctx,
+                           const string& key,
                            PutParams& params,
                            RGWObjVersionTracker *objv_tracker,
                            RGWMDLogSyncType sync_mode)
 {
   std::function<int()> f = [&]() {
-    return put_entry(ctx, params, objv_tracker);
+    return put_entry(ctx, key, params, objv_tracker);
   };
 
-  return mutate(ctx, params.mtime, objv_tracker,
+  return mutate(ctx, key, params.mtime, objv_tracker,
                 MDLOG_STATUS_WRITE, sync_mode,
                 f,
                 false);
 }
 
 int RGWSI_MetaBackend::remove(Context *ctx,
+                              const string& key,
                               RemoveParams& params,
                               RGWObjVersionTracker *objv_tracker,
                               RGWMDLogSyncType sync_mode)
 {
   std::function<int()> f = [&]() {
-    return remove_entry(ctx, params, objv_tracker);
+    return remove_entry(ctx, key, params, objv_tracker);
   };
 
-  return mutate(ctx, params.mtime, objv_tracker,
+  return mutate(ctx, key, params.mtime, objv_tracker,
                 MDLOG_STATUS_REMOVE, sync_mode,
                 f,
                 false);
 }
 
+
+int RGWSI_MetaBackend_Handler::call(std::function<int(Op *)> f)
+{
+  return be->call([&](RGWSI_MetaBackend::Context *ctx) {
+    ctx->init(this);
+    Op op(be, ctx);
+    return f(&op);
+  });
+}
+
index 19cadfde2cf7ea0ac3bbc75609a47d8c3b74ef78..9bd831aca6fdb46e85700678ea10c3ab5a052683 100644 (file)
 #include "rgw/rgw_service.h"
 #include "rgw/rgw_mdlog_types.h"
 
-class RGWMetadataHandler;
 class RGWMetadataLogData;
-class RGWMetadataObject;
 
 class RGWSI_MDLog;
 class RGWSI_Meta;
-
-typedef void *RGWSI_MetaBackend_Handle;
+class RGWObjVersionTracker;
+class RGWSI_MetaBackend_Handler;
 
 class RGWSI_MetaBackend : public RGWServiceInstance
 {
@@ -36,24 +34,20 @@ public:
   class Module;
   class Context;
 protected:
-  map<string, RGWMetadataHandler *> handlers;
-
   RGWSI_MDLog *mdlog_svc{nullptr};
 
-  int find_handler(const string& metadata_key, RGWMetadataHandler **handler, string& entry);
-
   void base_init(RGWSI_MDLog *_mdlog_svc) {
     mdlog_svc = _mdlog_svc;
   }
 
-  virtual int init_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handle *phandle) { return 0; }
-
   int prepare_mutate(RGWSI_MetaBackend::Context *ctx,
-                     const real_time& mtime,
+                     const std::string& key,
+                     const ceph::real_time& mtime,
                      RGWObjVersionTracker *objv_tracker,
                      RGWMDLogSyncType sync_mode);
 
   virtual int mutate(Context *ctx,
+                     const std::string& key,
                      const ceph::real_time& mtime, RGWObjVersionTracker *objv_tracker,
                      RGWMDLogStatus op_type,
                      RGWMDLogSyncType sync_mode,
@@ -61,10 +55,12 @@ protected:
                      bool generic_prepare);
 
   virtual int pre_modify(Context *ctx,
+                         const std::string& key,
                          RGWMetadataLogData& log_data,
                          RGWObjVersionTracker *objv_tracker,
                          RGWMDLogStatus op_type);
   virtual int post_modify(Context *ctx,
+                          const std::string& key,
                           RGWMetadataLogData& log_data,
                           RGWObjVersionTracker *objv_tracker, int ret);
 public:
@@ -74,10 +70,6 @@ public:
      */
   public:
     virtual ~Module() = 0;
-    /* key to use for hashing entries for log shard placement */
-    virtual void get_hash_key(const string& section, const string& key, string& hash_key) {
-      hash_key = section + ":" + key;
-    }
   };
 
   using ModuleRef = std::shared_ptr<Module>;
@@ -89,14 +81,7 @@ public:
                     */
     virtual ~Context() = 0;
 
-    RGWSI_MetaBackend_Handle handle;
-    Module *module{nullptr};
-    std::string section;
-    std::string key;
-
-    virtual void set_key(const string& _key) {
-      key = _key;
-    }
+    virtual void init(RGWSI_MetaBackend_Handler *h) = 0;
   };
 
   struct PutParams {
@@ -131,40 +116,93 @@ public:
 
   virtual Type get_type() = 0;
 
-  virtual void init_ctx(RGWSI_MetaBackend_Handle handle, Context *ctx) = 0;
-
+  virtual RGWSI_MetaBackend_Handler *alloc_be_handler() = 0;
   virtual GetParams *alloc_default_get_params(ceph::real_time *pmtime) = 0;
 
   /* these should be implemented by backends */
   virtual int get_entry(RGWSI_MetaBackend::Context *ctx,
+                        const std::string& key,
                         RGWSI_MetaBackend::GetParams& params,
                         RGWObjVersionTracker *objv_tracker,
                         optional_yield y) = 0;
   virtual int put_entry(RGWSI_MetaBackend::Context *ctx,
+                        const std::string& key,
                         RGWSI_MetaBackend::PutParams& params,
                         RGWObjVersionTracker *objv_tracker,
                         optional_yield y) = 0;
   virtual int remove_entry(Context *ctx,
+                           const std::string& key,
                            RGWSI_MetaBackend::RemoveParams& params,
                            RGWObjVersionTracker *objv_tracker,
                            optional_yield y) = 0;
 
-  /* these should be called by handlers */
+  virtual int call(std::function<int(RGWSI_MetaBackend::Context *)> f) = 0;
+
+  /* higher level */
   virtual int get(Context *ctx,
+                  const std::string& key,
                   GetParams &params,
                   RGWObjVersionTracker *objv_tracker,
                   optional_yield y);
 
   virtual int put(Context *ctx,
+                  const std::string& key,
                   PutParams& params,
                   RGWObjVersionTracker *objv_tracker,
                   optional_yield y,
                   RGWMDLogSyncType sync_mode);
 
   virtual int remove(Context *ctx,
+                     const std::string& key,
                      RemoveParams& params,
                      RGWObjVersionTracker *objv_tracker,
                      optional_yield y,
                      RGWMDLogSyncType sync_mode);
+
+};
+
+class RGWSI_MetaBackend_Handler {
+  RGWSI_MetaBackend *be{nullptr};
+
+public:
+  class Op {
+    friend class RGWSI_MetaBackend_Handler;
+
+    RGWSI_MetaBackend *be;
+    RGWSI_MetaBackend::Context *be_ctx;
+
+    Op(RGWSI_MetaBackend *_be,
+       RGWSI_MetaBackend::Context *_ctx) : be(_be), be_ctx(_ctx) {}
+
+  public:
+    RGWSI_MetaBackend::Context *ctx() {
+      return be_ctx;
+    }
+
+    int get(const std::string& key,
+            RGWSI_MetaBackend::GetParams &params,
+            RGWObjVersionTracker *objv_tracker) {
+      return be->get(be_ctx, key, params, objv_tracker);
+    }
+
+    int put(const std::string& key,
+            RGWSI_MetaBackend::PutParams& params,
+            RGWObjVersionTracker *objv_tracker,
+            RGWMDLogSyncType sync_mode) {
+      return be->put(be_ctx, key, params, objv_tracker, sync_mode);
+    }
+
+    int remove(const std::string& key,
+               RGWSI_MetaBackend::RemoveParams& params,
+               RGWObjVersionTracker *objv_tracker,
+               RGWMDLogSyncType sync_mode) {
+      return be->remove(be_ctx, key, params, objv_tracker, sync_mode);
+    }
+  };
+
+  RGWSI_MetaBackend_Handler(RGWSI_MetaBackend *_be) : be(_be) {}
+  virtual ~RGWSI_MetaBackend_Handler() {}
+
+  virtual int call(std::function<int(Op *)> f);
 };
 
index 16f8ac78ebcc0f087b3699c964c836070e39aeb4..917e01b1533c1a03a2b29fa011f6b1187544cc60 100644 (file)
@@ -14,46 +14,22 @@ RGWSI_MetaBackend_SObj::RGWSI_MetaBackend_SObj(CephContext *cct) : RGWSI_MetaBac
 RGWSI_MetaBackend_SObj::~RGWSI_MetaBackend_SObj() {
 }
 
-int RGWSI_MetaBackend_SObj::init_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handle *phandle)
+RGWSI_MetaBackend_Handler *RGWSI_MetaBackend_SObj::alloc_be_handler()
 {
-  const auto& section = handler->get_type();
-
-  auto& info = handlers[section];
-  info.section = section;
-  info._module = handler->get_be_module();
-  info.module = static_cast<RGWSI_MBSObj_Handler_Module *>(info._module.get());
-  
-  *phandle = (RGWSI_MetaBackend_Handle)(&info);
-
-  return 0;
+  return new RGWSI_MetaBackend_Handler_SObj(this);
 }
 
-void RGWSI_MetaBackend_SObj::init_ctx(RGWSI_MetaBackend_Handle handle, RGWSI_MetaBackend::Context *_ctx)
+int RGWSI_MetaBackend_SObj::call(std::function<int(RGWSI_MetaBackend::Context *)> f)
 {
-  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->handle = handle;
-  ctx->module = h->module;
-  ctx->section = h->section;
-  ctx->_obj_ctx.emplace(sysobj_svc->init_obj_ctx());
-  ctx->obj_ctx = &(*ctx->_obj_ctx);
+  RGWSI_MetaBackend_SObj::Context_SObj ctx(sysobj_svc);
+  return f(&ctx);
 }
 
-void RGWSI_MetaBackend_SObj::Context_SObj::set_key(const string& _key)
+void RGWSI_MetaBackend_SObj::Context_SObj::init(RGWSI_MetaBackend_Handler *h)
 {
-  RGWSI_MetaBackend::Context::set_key(_key);
-  static_cast<RGWSI_MBSObj_Handler_Module *>(module)->get_pool_and_oid(key, pool, oid);
-}
-
-RGWSI_MetaBackend_SObj::Context_SObj *RGWSI_MetaBackend_SObj::Context_SObj::clone(const string& key)
-{
-  if (!_ctx2) {
-    _ctx2.reset(new RGWSI_MetaBackend_SObj::Context_SObj);
-  }
-  *_ctx2 = *this;
-  _ctx2->set_key(key);
-  return _ctx2.get();
+  RGWSI_MetaBackend_Handler_SObj *handler = static_cast<RGWSI_MetaBackend_Handler_SObj *>(h);
+  module = handler->module;
+  obj_ctx.emplace(sysobj_svc->init_obj_ctx());
 }
 
 RGWSI_MetaBackend::GetParams *RGWSI_MetaBackend_SObj::alloc_default_get_params(ceph::real_time *pmtime)
@@ -66,13 +42,18 @@ RGWSI_MetaBackend::GetParams *RGWSI_MetaBackend_SObj::alloc_default_get_params(c
 }
 
 int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
+                                      const string& key,
                                       GetParams& _params,
                                       RGWObjVersionTracker *objv_tracker)
 {
   RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
   RGWSI_MBSObj_GetParams& params = static_cast<RGWSI_MBSObj_GetParams&>(_params);
 
-  return rgw_get_system_obj(*ctx->obj_ctx, ctx->pool, ctx->oid, *params.pbl,
+  rgw_pool pool;
+  string oid;
+  ctx->module->get_pool_and_oid(key, &pool, &oid);
+
+  return rgw_get_system_obj(*ctx->obj_ctx, pool, oid, *params.pbl,
                             objv_tracker, params.pmtime,
                             params.y,
                             params.pattrs, params.cache_info,
@@ -80,23 +61,32 @@ int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
 }
 
 int RGWSI_MetaBackend_SObj::put_entry(RGWSI_MetaBackend::Context *_ctx,
+                                      const string& key,
                                       PutParams& _params,
                                       RGWObjVersionTracker *objv_tracker)
 {
   RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
   RGWSI_MBSObj_PutParams& params = static_cast<RGWSI_MBSObj_PutParams&>(_params);
 
-  return rgw_put_system_obj(*ctx->obj_ctx, ctx->pool, ctx->oid, params.bl, params.exclusive,
+  rgw_pool pool;
+  string oid;
+  ctx->module->get_pool_and_oid(key, &pool, &oid);
+
+  return rgw_put_system_obj(*ctx->obj_ctx, pool, oid, params.bl, params.exclusive,
                             objv_tracker, params.mtime, params.y, params.pattrs);
 }
 
 int RGWSI_MetaBackend_SObj::remove_entry(RGWSI_MetaBackend::Context *_ctx,
+                                         const string& key,
                                          RemoveParams& params,
                                          RGWObjVersionTracker *objv_tracker)
 {
   RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
 
-  rgw_raw_obj k(ctx->pool, ctx->oid);
+  rgw_pool pool;
+  string oid;
+  ctx->module->get_pool_and_oid(key, &pool, &oid);
+  rgw_raw_obj k(pool, oid);
 
   auto sysobj = ctx->obj_ctx->get_obj(k);
   return sysobj.wop()
index 8b1cde67036473cd8b792ad0981575cc5751526a..c6137d58f523ac3f0a4e70d376035f2dfd060c94 100644 (file)
 #include "svc_sys_obj.h"
 
 
-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:
-  virtual void get_pool_and_oid(const string& key, rgw_pool& pool, string& oid) = 0;
+  virtual void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) = 0;
   virtual void key_to_oid(string& key) {}
   virtual void oid_to_key(string& oid) {}
+
+  /* key to use for hashing entries for log shard placement */
+  virtual void get_hash_key(const std::string& section, const std::string& key, std::string& hash_key) {
+    hash_key = section + ":" + key;
+  }
 };
 
 struct RGWSI_MBSObj_GetParams : public RGWSI_MetaBackend::GetParams {
@@ -46,46 +42,34 @@ struct RGWSI_MBSObj_GetParams : public RGWSI_MetaBackend::GetParams {
   map<string, bufferlist> *pattrs{nullptr};
   rgw_cache_entry_info *cache_info{nullptr};
   boost::optional<obj_version> refresh_version;
-  optional_yield y{null_yield};
 
   RGWSI_MBSObj_GetParams() {}
   RGWSI_MBSObj_GetParams(bufferlist *_pbl,
                          std::map<string, bufferlist> *_pattrs,
-                         ceph::real_time *_pmtime,
-                         optional_yield _y) : RGWSI_MetaBackend::GetParams(_pmtime),
+                         ceph::real_time *_pmtime) : RGWSI_MetaBackend::GetParams(_pmtime),
                                               pbl(_pbl),
-                                              pattrs(_pattrs),
-                                              y(_y) {}
+                                              pattrs(_pattrs) {}
 };
 
 struct RGWSI_MBSObj_PutParams : public RGWSI_MetaBackend::PutParams {
   bufferlist bl;
   map<string, bufferlist> *pattrs{nullptr};
   bool exclusive{false};
-  optional_yield y{null_yield};
 
   RGWSI_MBSObj_PutParams() {}
   RGWSI_MBSObj_PutParams(std::map<string, bufferlist> *_pattrs,
-                         const ceph::real_time& _mtime,
-                         optional_yield _y) : RGWSI_MetaBackend::PutParams(_mtime),
-                                              pattrs(_pattrs),
-                                              y(_y) {}
+                         const ceph::real_time& _mtime) : RGWSI_MetaBackend::PutParams(_mtime),
+                                                          pattrs(_pattrs) {}
   RGWSI_MBSObj_PutParams(bufferlist& _bl,
                          std::map<string, bufferlist> *_pattrs,
                          const ceph::real_time& _mtime,
-                         bool _exclusive,
-                         optional_yield _y) : RGWSI_MetaBackend::PutParams(_mtime),
-                                              bl(_bl),
-                                              pattrs(_pattrs),
-                                              exclusive(_exclusive),
-                                              y(_y) {}
+                         bool _exclusive) : RGWSI_MetaBackend::PutParams(_mtime),
+                                            bl(_bl),
+                                            pattrs(_pattrs),
+                                            exclusive(_exclusive) {}
 };
 
 struct RGWSI_MBSObj_RemoveParams : public RGWSI_MetaBackend::RemoveParams {
-  optional_yield y{null_yield};
-
-  RGWSI_MBSObj_RemoveParams() {}
-  RGWSI_MBSObj_RemoveParams(optional_yield _y) : y(_y) {}
 };
 
 class RGWSI_MetaBackend_SObj : public RGWSI_MetaBackend
@@ -93,31 +77,16 @@ class RGWSI_MetaBackend_SObj : public RGWSI_MetaBackend
 protected:
   RGWSI_SysObj *sysobj_svc{nullptr};
 
-  map<string, rgwsi_meta_be_sobj_handler_info> handlers;
-
-  int init_handler(RGWMetadataHandler *handler, RGWSI_MetaBackend_Handle *phandle) override;
-
 public:
   struct Context_SObj : public RGWSI_MetaBackend::Context {
-    std::optional<RGWSysObjectCtx> _obj_ctx;
-    RGWSysObjectCtx *obj_ctx{nullptr};
-    rgw_pool pool;
-    string oid;
+    RGWSI_SysObj *sysobj_svc{nullptr};
 
-    std::unique_ptr<Context_SObj> _ctx2;
+    RGWSI_MBSObj_Handler_Module *module{nullptr};
+    optional<RGWSysObjectCtx> obj_ctx;
 
-    Context_SObj& operator=(const Context_SObj& rhs) {
-      _obj_ctx.reset();
-      obj_ctx = rhs.obj_ctx;
-      pool = rhs.pool;
-      oid = rhs.oid;
-      _ctx2.reset(); /* this isn't carried over */
-      return *this;
-    }
+    Context_SObj(RGWSI_SysObj *_sysobj_svc) : sysobj_svc(_sysobj_svc) {}
 
-    void set_key(const string& key) override;
-
-    Context_SObj *clone(const string& key);
+    void init(RGWSI_MetaBackend_Handler *h) override;
   };
 
   RGWSI_MetaBackend_SObj(CephContext *cct);
@@ -133,19 +102,41 @@ public:
     sysobj_svc = _sysobj_svc;
   }
 
-  void init_ctx(RGWSI_MetaBackend_Handle handle, RGWSI_MetaBackend::Context *ctx) override;
+  RGWSI_MetaBackend_Handler *alloc_be_handler() override;
 
   RGWSI_MetaBackend::GetParams *alloc_default_get_params(ceph::real_time *pmtime) override;
 
   int get_entry(RGWSI_MetaBackend::Context *ctx,
+                const string& key,
                 RGWSI_MetaBackend::GetParams& params,
                 RGWObjVersionTracker *objv_tracker) override;
   int put_entry(RGWSI_MetaBackend::Context *ctx,
+                const string& key,
                 RGWSI_MetaBackend::PutParams& params,
                 RGWObjVersionTracker *objv_tracker) override;
   int remove_entry(RGWSI_MetaBackend::Context *ctx,
+                   const string& key,
                    RGWSI_MetaBackend::RemoveParams& params,
                    RGWObjVersionTracker *objv_tracker) override;
+
+  int call(std::function<int(RGWSI_MetaBackend::Context *)> f) override;
 };
 
 
+class RGWSI_MetaBackend_Handler_SObj : public RGWSI_MetaBackend_Handler {
+  friend class RGWSI_MetaBackend_SObj::Context_SObj;
+
+  RGWSI_MBSObj_Handler_Module *module{nullptr};
+
+public:
+  RGWSI_MetaBackend_Handler_SObj(RGWSI_MetaBackend *be) : 
+                                            RGWSI_MetaBackend_Handler(be) {}
+  
+  void set_module(RGWSI_MBSObj_Handler_Module *_module) {
+    module = _module;
+  }
+
+  RGWSI_MBSObj_Handler_Module *get_module() {
+    return module;
+  }
+};
index 096d5c1067d3df0bd1c4427451cd34e72f89d677..b130a87cb3b38e3fbd104a59eb6a50ea69c5d0d4 100644 (file)
@@ -5,6 +5,7 @@
 #include "svc_sys_obj.h"
 #include "svc_sys_obj_cache.h"
 #include "svc_meta.h"
+#include "svc_meta_be_sobj.h"
 #include "svc_sync_modules.h"
 
 #include "rgw/rgw_user.h"
 
 #define dout_subsys ceph_subsys_rgw
 
+class RGWSI_User_Module : public RGWSI_MBSObj_Handler_Module {
+  RGWSI_User::Svc& svc;
+public:
+  RGWSI_User_Module(RGWSI_User::Svc& _svc) : svc(_svc) {}
+
+  void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) override {
+    *oid = key;
+    *pool = svc.zone->get_zone_params().user_uid_pool;
+  }
+};
+
 RGWSI_User::RGWSI_User(CephContext *cct): RGWServiceInstance(cct) {
 }
 
@@ -37,10 +49,23 @@ int RGWSI_User::do_start()
 {
   uinfo_cache.reset(new RGWChainedCacheImpl<user_info_cache_entry>);
   uinfo_cache->init(svc.cache);
+
+  int r = svc.meta->create_be_handler(RGWSI_MetaBackend::Type::MDBE_SOBJ, &be_handler);
+  if (r < 0) {
+    ldout(ctx(), 0) << "ERROR: failed to create be handler: r=" << r << dendl;
+    return r;
+  }
+
+  RGWSI_MetaBackend_Handler_SObj *bh = static_cast<RGWSI_MetaBackend_Handler_SObj *>(be_handler);
+
+  auto module = new RGWSI_User_Module(svc);
+  be_module.reset(module);
+  bh->set_module(module);
   return 0;
 }
 
 int RGWSI_User::read_user_info(RGWSI_MetaBackend::Context *ctx,
+                               const rgw_user& user,
                                RGWUserInfo *info,
                                RGWObjVersionTracker * const objv_tracker,
                                real_time * const pmtime,
@@ -54,7 +79,7 @@ int RGWSI_User::read_user_info(RGWSI_MetaBackend::Context *ctx,
 
   RGWSI_MBSObj_GetParams params(&bl, pattrs, pmtime);
 
-  int ret = svc.meta_be->get_entry(ctx, params, objv_tracker, y);
+  int ret = svc.meta_be->get_entry(ctx, get_meta_key(user), params, objv_tracker, y);
   if (ret < 0) {
     return ret;
   }
@@ -62,9 +87,8 @@ int RGWSI_User::read_user_info(RGWSI_MetaBackend::Context *ctx,
   auto iter = bl.cbegin();
   try {
     decode(user_id, iter);
-    auto meta_key = get_meta_key(user_id.user_id);
-    if (meta_key != ctx->key) {
-      lderr(svc.meta_be->ctx())  << "ERROR: rgw_get_user_info_by_uid(): user id mismatch: " << meta_key << " != " << ctx->key << dendl;
+    if (user_id.user_id != user) {
+      lderr(svc.meta_be->ctx())  << "ERROR: rgw_get_user_info_by_uid(): user id mismatch: " << user_id.user_id << " != " << user << dendl;
       return -EIO;
     }
     if (!iter.end()) {
@@ -167,7 +191,7 @@ public:
 
     RGWSI_MBSObj_PutParams params(data_bl, pattrs, mtime, exclusive);
 
-    int ret = svc.meta_be->put_entry(ctx, params, &ot);
+    int ret = svc.meta_be->put_entry(ctx, RGWSI_User::get_meta_key(info.user_id), params, &ot);
     if (ret < 0)
       return ret;
 
@@ -404,12 +428,12 @@ int RGWSI_User::remove_uid_index(RGWSI_MetaBackend::Context *ctx, const RGWUserI
 {
   ldout(cct, 10) << "removing user index: " << user_info.user_id << dendl;
 
-  RGWSI_MBSObj_RemoveParams params;
+  RGWSI_MBSObj_RemoveParams params(y);
 #warning need mtime?
 #if 0
   params.mtime = user_info.mtime;
 #endif
-  int ret = svc.meta_be->remove_entry(ctx, params, objv_tracker, y);
+  int ret = svc.meta_be->remove_entry(ctx, get_meta_key(user_info.user_id), params, objv_tracker);
   if (ret < 0 && ret != -ENOENT && ret  != -ECANCELED) {
     string key;
     user_info.user_id.to_str(key);
@@ -455,7 +479,7 @@ int RGWSI_User::get_user_info_from_index(RGWSI_MetaBackend::Context *_ctx,
   try {
     decode(uid, iter);
 
-    int ret = read_user_info(ctx->clone(get_meta_key(uid.user_id)),
+    int ret = read_user_info(ctx, uid.user_id,
                              &e.info, &e.objv_tracker, nullptr, &cache_info, nullptr, y);
     if (ret < 0) {
       return ret;
index 144e40ffd36d44032193b71dbbb34e117ba18364..20310aeb3b426cd533e6d586edaafd65c8ae473b 100644 (file)
@@ -26,19 +26,25 @@ class RGWSI_SysObj;
 class RGWSI_SysObj_Cache;
 class RGWSI_Meta;
 class RGWSI_SyncModules;
-class RGWMetadataHandler;
+class RGWSI_MetaBackend_Handler;
 
 struct rgw_cache_entry_info;
 
 template <class T>
 class RGWChainedCacheImpl;
 
+/* FIXME:
+ * split RGWSI_User to base class and RGWSI_User_SObj
+ */
+
 class RGWSI_User : public RGWServiceInstance
 {
   friend class User;
   friend class PutOperation;
 
-  RGWMetadataHandler *user_meta_handler;
+  std::unique_ptr<RGWSI_MetaBackend::Module> be_module;
+
+  RGWSI_MetaBackend_Handler *be_handler;
 
   struct user_info_cache_entry {
     RGWUserInfo info;
@@ -82,18 +88,22 @@ public:
             RGWSI_MetaBackend *_meta_be_svc,
            RGWSI_SyncModules *_sync_modules);
 
+  RGWSI_MetaBackend_Handler *get_be_handler() {
+    return be_handler;
+  }
+
   static string get_meta_key(const rgw_user& user) {
     return user.to_str();
   }
 
-  static string get_buckets_oid(const rgw_user& user_id) {
-#define RGW_BUCKETS_OID_SUFFIX ".buckets"
-    return user_id.to_str() + RGW_BUCKETS_OID_SUFFIX;
+  static rgw_user user_from_meta_key(const string& key) {
+    return rgw_user(key);
   }
 
   /* base svc_user interfaces */
 
   int read_user_info(RGWSI_MetaBackend::Context *ctx,
+                     const rgw_user& user,
                      RGWUserInfo *info,
                      RGWObjVersionTracker * const objv_tracker,
                      real_time * const pmtime,