]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/metadata: use raw RGWMetadataHandler for user metadata
authorCasey Bodley <cbodley@redhat.com>
Mon, 4 Dec 2023 00:12:13 +0000 (19:12 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 12 Sep 2024 20:55:01 +0000 (16:55 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/rados/rgw_service.cc
src/rgw/driver/rados/rgw_user.cc
src/rgw/driver/rados/rgw_user.h
src/rgw/services/svc_user.h
src/rgw/services/svc_user_rados.cc
src/rgw/services/svc_user_rados.h

index b6239ac3ea4e8528ce985a6214cf7e25d58b6659..5b9d71195607fb358e53bbaf744367faa6846177 100644 (file)
@@ -119,8 +119,8 @@ int RGWServices_Def::init(CephContext *cct,
   } else {
     sysobj->init(driver->getRados()->get_rados_handle(), sysobj_core.get());
   }
-  user_rados->init(driver->getRados()->get_rados_handle(), zone.get(), sysobj.get(), sysobj_cache.get(),
-                   meta.get(), meta_be_sobj.get(), sync_modules.get());
+  user_rados->init(driver->getRados()->get_rados_handle(), zone.get(), mdlog.get(),
+                   sysobj.get(), sysobj_cache.get(), meta.get());
   role_rados->init(zone.get(), meta.get(), meta_be_sobj.get(), sysobj.get());
   can_shutdown = true;
 
@@ -365,7 +365,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
 {
   meta.mgr.reset(new RGWMetadataManager(svc.meta));
 
-  meta.user.reset(RGWUserMetaHandlerAllocator::alloc(svc.user));
+  meta.user = create_user_metadata_handler(svc.user);
 
   bucket.reset(new RGWBucketCtl(svc.zone,
                                 svc.bucket,
@@ -391,7 +391,7 @@ int RGWCtlDef::init(RGWServices& svc, rgw::sal::Driver* driver,
   meta.group = rgwrados::group::create_metadata_handler(
       *svc.sysobj, rados, svc.zone->get_zone_params());
 
-  user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get()));
+  user = std::make_unique<RGWUserCtl>(svc.zone, svc.user);
 
   meta.topic_cache = std::make_unique<RGWChainedCacheImpl<rgwrados::topic::cache_entry>>();
   meta.topic_cache->init(svc.cache);
index 4dbc7de748407fd1f6b4e673264140b3160c1b8f..d26495d9b0f3fe0e74cf3ae82c997849472d7795 100644 (file)
@@ -1,12 +1,14 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab ft=cpp
 
+#include "rgw_user.h"
 #include "common/errno.h"
 
-#include "rgw_user.h"
 
 #include "rgw_account.h"
 #include "rgw_bucket.h"
+#include "rgw_metadata.h"
+#include "rgw_metadata_lister.h"
 #include "rgw_quota.h"
 #include "rgw_rest_iam.h" // validate_iam_user_name()
 
@@ -2701,42 +2703,48 @@ int RGWUserAdminOp_Caps::remove(const DoutPrefixProvider *dpp,
   return 0;
 }
 
-class RGWUserMetadataHandler : public RGWMetadataHandler_GenericMetaBE {
-public:
-  struct Svc {
-    RGWSI_User *user{nullptr};
-  } svc;
+struct RGWUserCompleteInfo {
+  RGWUserInfo info;
+  std::map<std::string, bufferlist> attrs;
+  bool has_attrs{false};
 
-  RGWUserMetadataHandler(RGWSI_User *user_svc) {
-    base_init(user_svc->ctx(), user_svc->get_be_handler());
-    svc.user = user_svc;
+  void dump(Formatter * const f) const {
+    info.dump(f);
+    encode_json("attrs", attrs, f);
   }
 
-  ~RGWUserMetadataHandler() {}
-
-  string get_type() override { return "user"; }
+  void decode_json(JSONObj *obj) {
+    decode_json_obj(info, obj);
+    has_attrs = JSONDecoder::decode_json("attrs", attrs, obj);
+  }
+};
 
-  int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y, const DoutPrefixProvider *dpp) override {
-    RGWUserCompleteInfo uci;
-    RGWObjVersionTracker objv_tracker;
-    real_time mtime;
+class RGWUserMetadataObject : public RGWMetadataObject {
+  RGWUserCompleteInfo uci;
+public:
+  RGWUserMetadataObject(const RGWUserCompleteInfo& uci,
+                        const obj_version& v, ceph::real_time m)
+    : RGWMetadataObject(v, m), uci(uci) {}
 
-    rgw_user user = RGWSI_User::user_from_meta_key(entry);
+  void dump(Formatter *f) const override {
+    uci.dump(f);
+  }
 
-    int ret = svc.user->read_user_info(user, &uci.info, &objv_tracker,
-                                       &mtime, nullptr, &uci.attrs,
-                                       y, dpp);
-    if (ret < 0) {
-      return ret;
-    }
+  RGWUserCompleteInfo& get_uci() {
+    return uci;
+  }
+};
 
-    RGWUserMetadataObject *mdo = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime);
-    *obj = mdo;
+class RGWUserMetadataHandler : public RGWMetadataHandler {
+  RGWSI_User *svc_user{nullptr};
+ public:
+  explicit RGWUserMetadataHandler(RGWSI_User* svc_user)
+    : svc_user(svc_user) {}
 
-    return 0;
-  }
+  string get_type() override { return "user"; }
 
-  RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) override {
+  RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv,
+                                  const ceph::real_time& mtime) override {
     RGWUserCompleteInfo uci;
 
     try {
@@ -2748,87 +2756,144 @@ public:
     return new RGWUserMetadataObject(uci, objv, mtime);
   }
 
-  int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
-             RGWMetadataObject *obj,
-             RGWObjVersionTracker& objv_tracker,
-             optional_yield y, const DoutPrefixProvider *dpp,
-             RGWMDLogSyncType type, bool from_remote_zone) override;
-
-  int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
-                optional_yield y, const DoutPrefixProvider *dpp) override {
-    RGWUserInfo info;
+  int get(std::string& entry, RGWMetadataObject** obj, optional_yield y,
+          const DoutPrefixProvider *dpp) override;
+  int put(std::string& entry, RGWMetadataObject* obj,
+          RGWObjVersionTracker& objv_tracker,
+          optional_yield y, const DoutPrefixProvider* dpp,
+          RGWMDLogSyncType type, bool from_remote_zone) override;
+  int remove(std::string& entry, RGWObjVersionTracker& objv_tracker,
+             optional_yield y, const DoutPrefixProvider *dpp) override;
+
+  int mutate(const std::string& entry, const ceph::real_time& mtime,
+             RGWObjVersionTracker* objv_tracker, optional_yield y,
+             const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
+             std::function<int()> f) override;
+
+  int list_keys_init(const DoutPrefixProvider* dpp, const std::string& marker,
+                     void** phandle) override;
+  int list_keys_next(const DoutPrefixProvider* dpp, void* handle, int max,
+                     std::list<std::string>& keys, bool* truncated) override;
+  void list_keys_complete(void *handle) override;
+  std::string get_marker(void *handle) override;
+};
 
-    rgw_user user = RGWSI_User::user_from_meta_key(entry);
+int RGWUserMetadataHandler::get(std::string& entry, RGWMetadataObject **obj,
+                                optional_yield y, const DoutPrefixProvider *dpp)
+{
+  RGWUserCompleteInfo uci;
+  RGWObjVersionTracker objv_tracker;
+  real_time mtime;
 
-    int ret = svc.user->read_user_info(user, &info, nullptr,
-                                       nullptr, nullptr, nullptr,
-                                       y, dpp);
-    if (ret < 0) {
-      return ret;
-    }
+  rgw_user user = RGWSI_User::user_from_meta_key(entry);
 
-    return svc.user->remove_user_info(info, &objv_tracker, y, dpp);
+  int ret = svc_user->read_user_info(user, &uci.info, &objv_tracker,
+                                     &mtime, nullptr, &uci.attrs,
+                                     y, dpp);
+  if (ret < 0) {
+    return ret;
   }
-};
 
-class RGWMetadataHandlerPut_User : public RGWMetadataHandlerPut_SObj
+  *obj = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime);
+  return 0;
+}
+
+int RGWUserMetadataHandler::put(std::string& entry, RGWMetadataObject *obj,
+                                RGWObjVersionTracker& objv_tracker,
+                                optional_yield y, const DoutPrefixProvider *dpp,
+                                RGWMDLogSyncType type, bool from_remote_zone)
 {
-  RGWUserMetadataHandler *uhandler;
-  RGWUserMetadataObject *uobj;
-public:
-  RGWMetadataHandlerPut_User(RGWUserMetadataHandler *_handler,
-                             RGWSI_MetaBackend_Handler::Op *op, string& entry,
-                             RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
-                             optional_yield y,
-                             RGWMDLogSyncType type, bool from_remote_zone) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
-                                                                uhandler(_handler) {
-    uobj = static_cast<RGWUserMetadataObject *>(obj);
+  const rgw_user user = RGWSI_User::user_from_meta_key(entry);
+
+  // read existing user info
+  std::optional old = RGWUserCompleteInfo{};
+  int ret = svc_user->read_user_info(user, &old->info, &objv_tracker,
+                                     nullptr, nullptr, &old->attrs, y, dpp);
+  if (ret == -ENOENT) {
+    old = std::nullopt;
+  } else if (ret < 0) {
+    return ret;
   }
+  RGWUserInfo* pold_info = (old ? &old->info : nullptr);
 
-  int put_checked(const DoutPrefixProvider *dpp) override;
-};
+  // store the updated user info
+  auto newobj = static_cast<RGWUserMetadataObject*>(obj);
+  RGWUserCompleteInfo& uci = newobj->get_uci();
+  auto pattrs = (uci.has_attrs ? &uci.attrs : nullptr);
+  auto mtime = obj->get_mtime();
 
-int RGWUserMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
-                                   RGWMetadataObject *obj,
-                                   RGWObjVersionTracker& objv_tracker,
-                                   optional_yield y, const DoutPrefixProvider *dpp,
-                                   RGWMDLogSyncType type, bool from_remote_zone)
-{
-  RGWMetadataHandlerPut_User put_op(this, op, entry, obj, objv_tracker, y, type, from_remote_zone);
-  return do_put_operate(&put_op, dpp);
+  ret = svc_user->store_user_info(uci.info, pold_info, &objv_tracker,
+                                  mtime, false, pattrs, y, dpp);
+  if (ret < 0) {
+    return ret;
+  }
+
+  return STATUS_APPLIED;
 }
 
-int RGWMetadataHandlerPut_User::put_checked(const DoutPrefixProvider *dpp)
+int RGWUserMetadataHandler::remove(std::string& entry, RGWObjVersionTracker& objv_tracker,
+                                   optional_yield y, const DoutPrefixProvider *dpp)
 {
-  RGWUserMetadataObject *orig_obj = static_cast<RGWUserMetadataObject *>(old_obj);
-  RGWUserCompleteInfo& uci = uobj->get_uci();
+  RGWUserInfo info;
 
-  map<string, bufferlist> *pattrs{nullptr};
-  if (uci.has_attrs) {
-    pattrs = &uci.attrs;
+  rgw_user user = RGWSI_User::user_from_meta_key(entry);
+
+  int ret = svc_user->read_user_info(user, &info, nullptr,
+                                     nullptr, nullptr, nullptr,
+                                     y, dpp);
+  if (ret < 0) {
+    return ret;
   }
 
-  RGWUserInfo *pold_info = (orig_obj ? &orig_obj->get_uci().info : nullptr);
+  return svc_user->remove_user_info(info, &objv_tracker, y, dpp);
+};
 
-  auto mtime = obj->get_mtime();
+int RGWUserMetadataHandler::mutate(const std::string& entry, const ceph::real_time& mtime,
+                                   RGWObjVersionTracker* objv_tracker, optional_yield y,
+                                   const DoutPrefixProvider* dpp, RGWMDLogStatus op_type,
+                                   std::function<int()> f)
+{
+  return -ENOTSUP; // unused
+}
 
-  int ret = uhandler->svc.user->store_user_info(uci.info, pold_info,
-                                               &objv_tracker, mtime,
-                                               false, pattrs, y, dpp);
+int RGWUserMetadataHandler::list_keys_init(const DoutPrefixProvider* dpp,
+                                           const std::string& marker,
+                                           void** phandle)
+{
+  std::unique_ptr<RGWMetadataLister> lister;
+  int ret = svc_user->create_lister(dpp, marker, lister);
   if (ret < 0) {
     return ret;
   }
+  *phandle = lister.release(); // release ownership
+  return 0;
+}
 
-  return STATUS_APPLIED;
+int RGWUserMetadataHandler::list_keys_next(const DoutPrefixProvider* dpp,
+                                           void* handle, int max,
+                                           std::list<std::string>& keys,
+                                           bool* truncated)
+{
+  auto lister = static_cast<RGWMetadataLister*>(handle);
+  return lister->get_next(dpp, max, keys, truncated);
+}
+
+void RGWUserMetadataHandler::list_keys_complete(void *handle)
+{
+  delete static_cast<RGWMetadataLister*>(handle);
+}
+
+std::string RGWUserMetadataHandler::get_marker(void *handle)
+{
+  auto lister = static_cast<RGWMetadataLister*>(handle);
+  return lister->get_marker();
 }
 
 
-RGWUserCtl::RGWUserCtl(RGWSI_Zone *zone_svc,
-                       RGWSI_User *user_svc,
-                       RGWUserMetadataHandler *_umhandler) : umhandler(_umhandler) {
+RGWUserCtl::RGWUserCtl(RGWSI_Zone *zone_svc, RGWSI_User *user_svc)
+{
   svc.zone = zone_svc;
   svc.user = user_svc;
-  be_handler = umhandler->get_be_handler();
 }
 
 template <class T>
@@ -2953,8 +3018,10 @@ int RGWUserCtl::remove_info(const DoutPrefixProvider *dpp,
   return svc.user->remove_user_info(info, params.objv_tracker, y, dpp);
 }
 
-RGWMetadataHandler *RGWUserMetaHandlerAllocator::alloc(RGWSI_User *user_svc) {
-  return new RGWUserMetadataHandler(user_svc);
+auto create_user_metadata_handler(RGWSI_User *user_svc)
+    -> std::unique_ptr<RGWMetadataHandler>
+{
+  return std::make_unique<RGWUserMetadataHandler>(user_svc);
 }
 
 void rgw_user::dump(Formatter *f) const
index d3303f96257df35f8f9faf93fe5f62fc1e3ac458..ab157f38e39641b6d0178a755f5a6a06fc77b03d 100644 (file)
@@ -15,7 +15,6 @@
 
 #include "common/Formatter.h"
 #include "rgw_formats.h"
-#include "rgw_metadata.h"
 #include "rgw_sal_fwd.h"
 
 #define RGW_USER_ANON_ID "anonymous"
@@ -29,6 +28,8 @@
 class RGWUserCtl;
 class RGWBucketCtl;
 class RGWUserBuckets;
+class RGWMetadataHandler;
+class RGWSI_User;
 
 // generate a random secret access key of SECRET_KEY_LEN=40
 void rgw_generate_secret_key(CephContext* cct,
@@ -728,43 +729,6 @@ public:
                    optional_yield y);
 };
 
-struct RGWUserCompleteInfo {
-  RGWUserInfo info;
-  std::map<std::string, bufferlist> attrs;
-  bool has_attrs{false};
-
-  void dump(Formatter * const f) const {
-    info.dump(f);
-    encode_json("attrs", attrs, f);
-  }
-
-  void decode_json(JSONObj *obj) {
-    decode_json_obj(info, obj);
-    has_attrs = JSONDecoder::decode_json("attrs", attrs, obj);
-  }
-};
-
-class RGWUserMetadataObject : public RGWMetadataObject {
-  RGWUserCompleteInfo uci;
-public:
-  RGWUserMetadataObject() {}
-  RGWUserMetadataObject(const RGWUserCompleteInfo& _uci, const obj_version& v, real_time m)
-      : uci(_uci) {
-    objv = v;
-    mtime = m;
-  }
-
-  void dump(Formatter *f) const override {
-    uci.dump(f);
-  }
-
-  RGWUserCompleteInfo& get_uci() {
-    return uci;
-  }
-};
-
-class RGWUserMetadataHandler;
-
 class RGWUserCtl
 {
   struct Svc {
@@ -776,13 +740,8 @@ class RGWUserCtl
     RGWBucketCtl *bucket{nullptr};
   } ctl;
 
-  RGWUserMetadataHandler *umhandler;
-  RGWSI_MetaBackend_Handler *be_handler{nullptr};
-  
 public:
-  RGWUserCtl(RGWSI_Zone *zone_svc,
-             RGWSI_User *user_svc,
-             RGWUserMetadataHandler *_umhandler);
+  RGWUserCtl(RGWSI_Zone *zone_svc, RGWSI_User *user_svc);
 
   void init(RGWBucketCtl *bucket_ctl) {
     ctl.bucket = bucket_ctl;
@@ -894,7 +853,6 @@ public:
                   const RemoveParams& params = {});
 };
 
-class RGWUserMetaHandlerAllocator {
-public:
-  static RGWMetadataHandler *alloc(RGWSI_User *user_svc);
-};
+// user metadata handler factory
+auto create_user_metadata_handler(RGWSI_User *user_svc)
+    -> std::unique_ptr<RGWMetadataHandler>;
index 88724ca2bc4eb0daf5ff67831b49eca0a5042b41..64c0259956f3f9c47f0ccf9ae668c095183d31a6 100644 (file)
 
 #pragma once
 
-#include "svc_meta_be.h"
-
+#include <memory>
 #include "rgw_service.h"
 #include "rgw_sal_fwd.h"
 
+class RGWMetadataLister;
 struct RGWUID;
 
 class RGWSI_User : public RGWServiceInstance
@@ -38,12 +38,14 @@ public:
     return rgw_user(key);
   }
 
-  virtual RGWSI_MetaBackend_Handler *get_be_handler() = 0;
-
   /* base svc_user interfaces */
 
   virtual rgw_raw_obj get_buckets_obj(const rgw_user& user_id) const = 0;
 
+  virtual int create_lister(const DoutPrefixProvider* dpp,
+                            const std::string& marker,
+                            std::unique_ptr<RGWMetadataLister>& lister) = 0;
+
   virtual int read_user_info(const rgw_user& user,
                              RGWUserInfo *info,
                              RGWObjVersionTracker * const objv_tracker,
index 47c88123984b670a2dcee5d822f1224de3c13c86..1e0533d2e8dec9804747637d53fcc5f09eb1af5d 100644 (file)
@@ -5,16 +5,16 @@
 
 #include "svc_user.h"
 #include "svc_user_rados.h"
+#include "svc_mdlog.h"
 #include "svc_zone.h"
 #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_user.h"
 #include "rgw_account.h"
 #include "rgw_bucket.h"
+#include "rgw_metadata_lister.h"
 #include "rgw_tools.h"
 #include "rgw_zone.h"
 #include "rgw_rados.h"
 
 using namespace std;
 
-class RGWSI_User_Module : public RGWSI_MBSObj_Handler_Module {
-  RGWSI_User_RADOS::Svc& svc;
-
-  const string prefix;
-public:
-  RGWSI_User_Module(RGWSI_User_RADOS::Svc& _svc) : RGWSI_MBSObj_Handler_Module("user"),
-                                                   svc(_svc) {}
-
-  void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) override {
-    if (pool) {
-      *pool = svc.zone->get_zone_params().user_uid_pool;
-    }
-    if (oid) {
-      *oid = key;
-    }
-  }
-
-  const string& get_oid_prefix() override {
-    return prefix;
-  }
-
-  bool is_valid_oid(const string& oid) override {
-    // filter out the user.buckets objects
-    return !boost::algorithm::ends_with(oid, RGW_BUCKETS_OBJ_SUFFIX);
-  }
-
-  string key_to_oid(const string& key) override {
-    return key;
-  }
-
-  string oid_to_key(const string& oid) override {
-    return oid;
-  }
-};
-
 RGWSI_User_RADOS::RGWSI_User_RADOS(CephContext *cct): RGWSI_User(cct) {
 }
 
@@ -72,37 +37,25 @@ RGWSI_User_RADOS::~RGWSI_User_RADOS() {
 }
 
 void RGWSI_User_RADOS::init(librados::Rados* rados_,
-                            RGWSI_Zone *_zone_svc, RGWSI_SysObj *_sysobj_svc,
-                            RGWSI_SysObj_Cache *_cache_svc, RGWSI_Meta *_meta_svc,
-                            RGWSI_MetaBackend *_meta_be_svc,
-                            RGWSI_SyncModules *_sync_modules_svc)
+                            RGWSI_Zone *_zone_svc,
+                            RGWSI_MDLog *mdlog_svc,
+                            RGWSI_SysObj *_sysobj_svc,
+                            RGWSI_SysObj_Cache *_cache_svc,
+                            RGWSI_Meta *_meta_svc)
 {
   svc.user = this;
   rados = rados_;
   svc.zone = _zone_svc;
+  svc.mdlog = mdlog_svc;
   svc.sysobj = _sysobj_svc;
   svc.cache = _cache_svc;
   svc.meta = _meta_svc;
-  svc.meta_be = _meta_be_svc;
-  svc.sync_modules = _sync_modules_svc;
 }
 
 int RGWSI_User_RADOS::do_start(optional_yield, const DoutPrefixProvider *dpp)
 {
   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) {
-    ldpp_dout(dpp, 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;
 }
 
@@ -112,6 +65,38 @@ rgw_raw_obj RGWSI_User_RADOS::get_buckets_obj(const rgw_user& user) const
   return rgw_raw_obj(svc.zone->get_zone_params().user_uid_pool, oid);
 }
 
+class UserLister : public RGWMetadataLister {
+ public:
+  using RGWMetadataLister::RGWMetadataLister;
+
+  void filter_transform(std::vector<std::string>& oids,
+                        std::list<std::string>& keys) override
+  {
+    // filter out the user.buckets objects
+    constexpr auto filter = [] (const std::string& oid) {
+                              return oid.ends_with(RGW_BUCKETS_OBJ_SUFFIX);
+                            };
+    // 'oids' is mutable so we can move its elements instead of copying
+    std::remove_copy_if(std::make_move_iterator(oids.begin()),
+                        std::make_move_iterator(oids.end()),
+                        std::back_inserter(keys), filter);
+  }
+};
+
+int RGWSI_User_RADOS::create_lister(const DoutPrefixProvider* dpp,
+                                    const std::string& marker,
+                                    std::unique_ptr<RGWMetadataLister>& lister)
+{
+  const rgw_pool& pool = svc.zone->get_zone_params().user_uid_pool;
+  auto p = std::make_unique<UserLister>(svc.sysobj->get_pool(pool));
+  int r = p->init(dpp, marker, ""); // empty prefix
+  if (r < 0) {
+    return r;
+  }
+  lister = std::move(p);
+  return 0;
+}
+
 int RGWSI_User_RADOS::read_user_info(const rgw_user& user,
                                RGWUserInfo *info,
                                RGWObjVersionTracker * const objv_tracker,
@@ -230,7 +215,7 @@ public:
 
     if (ot.write_version.tag.empty()) {
       if (ot.read_version.tag.empty()) {
-        ot.generate_new_write_ver(svc.meta_be->ctx());
+        ot.generate_new_write_ver(dpp->get_cct());
       } else {
         ot.write_version = ot.read_version;
         ot.write_version.ver++;
@@ -296,8 +281,12 @@ public:
 
     const rgw_pool& pool = svc.zone->get_zone_params().user_uid_pool;
     const std::string key = RGWSI_User::get_meta_key(info.user_id);
-    return rgw_put_system_obj(dpp, svc.sysobj, pool, key, data_bl,
-                              exclusive, &ot, mtime, y, pattrs);
+    int r = rgw_put_system_obj(dpp, svc.sysobj, pool, key, data_bl,
+                               exclusive, &ot, mtime, y, pattrs);
+    if (r < 0) {
+      return r;
+    }
+    return svc.mdlog->complete_entry(dpp, y, "user", key, &ot);
   }
 
   int complete(const DoutPrefixProvider *dpp) {
@@ -625,13 +614,16 @@ int RGWSI_User_RADOS::remove_uid_index(const RGWUserInfo& user_info, RGWObjVersi
   const rgw_pool& pool = svc.zone->get_zone_params().user_uid_pool;
   const std::string key = get_meta_key(user_info.user_id);
   int ret = rgw_delete_system_obj(dpp, svc.sysobj, pool, key, objv_tracker, y);
-  if (ret < 0 && ret != -ENOENT && ret  != -ECANCELED) {
+  if (ret == -ENOENT || ret  == -ECANCELED) {
+    return 0; // success but no mdlog entry
+  }
+  if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: could not remove " << user_info.user_id
         << ": " << cpp_strerror(ret) << dendl;
     return ret;
   }
 
-  return 0;
+  return svc.mdlog->complete_entry(dpp, y, "user", key, objv_tracker);
 }
 
 static int read_index(const DoutPrefixProvider* dpp, optional_yield y,
index 7e2929756b664784048cd62f780b7872d576ef1c..24c2368062f67f4122e78d2031581cd5cc667c87 100644 (file)
 
 #include "rgw_service.h"
 
-#include "svc_meta_be.h"
 #include "svc_user.h"
 
 #include "driver/rados/rgw_bucket.h" // FIXME: subclass dependency
 
+class RGWSI_MDLog;
 class RGWSI_Zone;
 class RGWSI_SysObj;
 class RGWSI_SysObj_Cache;
 class RGWSI_Meta;
 class RGWSI_SyncModules;
-class RGWSI_MetaBackend_Handler;
 
 struct rgw_cache_entry_info;
 
@@ -41,9 +40,6 @@ class RGWSI_User_RADOS : public RGWSI_User
 {
   friend class PutOperation;
 
-  std::unique_ptr<RGWSI_MetaBackend::Module> be_module;
-  RGWSI_MetaBackend_Handler *be_handler;
-
   struct user_info_cache_entry {
     RGWUserInfo info;
     RGWObjVersionTracker objv_tracker;
@@ -79,25 +75,25 @@ public:
   struct Svc {
     RGWSI_User_RADOS *user{nullptr};
     RGWSI_Zone *zone{nullptr};
+    RGWSI_MDLog *mdlog{nullptr};
     RGWSI_SysObj *sysobj{nullptr};
     RGWSI_SysObj_Cache *cache{nullptr};
     RGWSI_Meta *meta{nullptr};
-    RGWSI_MetaBackend *meta_be{nullptr};
-    RGWSI_SyncModules *sync_modules{nullptr};
   } svc;
 
   RGWSI_User_RADOS(CephContext *cct);
   ~RGWSI_User_RADOS();
 
   void init(librados::Rados* rados_,
-            RGWSI_Zone *_zone_svc, RGWSI_SysObj *_sysobj_svc,
-           RGWSI_SysObj_Cache *_cache_svc, RGWSI_Meta *_meta_svc,
-            RGWSI_MetaBackend *_meta_be_svc,
-           RGWSI_SyncModules *_sync_modules);
-
-  RGWSI_MetaBackend_Handler *get_be_handler() override {
-    return be_handler;
-  }
+            RGWSI_Zone *_zone_svc,
+            RGWSI_MDLog *mdlog_svc,
+            RGWSI_SysObj *_sysobj_svc,
+            RGWSI_SysObj_Cache *_cache_svc,
+            RGWSI_Meta *_meta_svc);
+
+  int create_lister(const DoutPrefixProvider* dpp,
+                    const std::string& marker,
+                    std::unique_ptr<RGWMetadataLister>& lister) override;
 
   int read_user_info(const rgw_user& user,
                      RGWUserInfo *info,