]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: better api for metadata mutation
authorYehuda Sadeh <yehuda@redhat.com>
Thu, 30 Nov 2017 10:29:41 +0000 (02:29 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Mon, 9 Apr 2018 14:01:02 +0000 (07:01 -0700)
Unlike the regular user and bucket metadata that are plain
raw rados objects, the otp info is controlled by object
class operations. The metadata manager mutate operation
will deal with the metadata related work that is needed
to happen (objv_tracker, update meta log), and call to
the operation that modifies the otp info.

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

index 66aa0489eb0e273f401bc0a12000d04ef5b4db04..17ca865b8c8648ff32fb1e0d342be85d836d6aeb 100644 (file)
@@ -779,6 +779,30 @@ int RGWMetadataManager::put(string& metadata_key, bufferlist& bl,
   return ret;
 }
 
+int RGWMetadataManager::prepare_mutate(RGWRados *store,
+                                       rgw_pool& pool, const string& oid,
+                                       const real_time& mtime,
+                                       RGWObjVersionTracker *objv_tracker,
+                                       RGWMetadataHandler::sync_type_t sync_mode)
+{
+  bufferlist bl;
+  real_time orig_mtime;
+  RGWObjectCtx obj_ctx(store);
+  int ret = rgw_get_system_obj(store, obj_ctx, pool, oid,
+                               bl, objv_tracker, &orig_mtime,
+                               nullptr, nullptr);
+  if (ret < 0 && ret != -ENOENT) {
+    return ret;
+  }
+  if (ret != -ENOENT &&
+      !RGWMetadataHandler::check_versions(objv_tracker->read_version, orig_mtime,
+                                          objv_tracker->write_version, mtime, sync_mode)) {
+    return STATUS_NO_APPLY;
+  }
+
+  return 0;
+}
+
 int RGWMetadataManager::remove(string& metadata_key)
 {
   RGWMetadataHandler *handler;
index e2a4e8cab5be1cc9862b0c816204e0958e188b0d..82b811a651346e5f8661d903b9e9e52b9e50ca85 100644 (file)
@@ -99,9 +99,9 @@ protected:
    *
    * @return true if the update should proceed, false otherwise.
    */
-  bool check_versions(const obj_version& ondisk, const real_time& ondisk_time,
-                      const obj_version& incoming, const real_time& incoming_time,
-                      sync_type_t sync_mode) {
+  static bool check_versions(const obj_version& ondisk, const real_time& ondisk_time,
+                             const obj_version& incoming, const real_time& incoming_time,
+                             sync_type_t sync_mode) {
     switch (sync_mode) {
     case APPLY_UPDATES:
       if ((ondisk.tag != incoming.tag) ||
@@ -314,6 +314,11 @@ class RGWMetadataManager {
                     RGWObjVersionTracker *objv_tracker, real_time mtime,
                     map<string, bufferlist> *pattrs);
   int remove_from_heap(RGWMetadataHandler *handler, const string& key, RGWObjVersionTracker *objv_tracker);
+  int prepare_mutate(RGWRados *store, rgw_pool& pool, const string& oid,
+                     const real_time& mtime,
+                     RGWObjVersionTracker *objv_tracker,
+                     RGWMetadataHandler::sync_type_t sync_mode);
+
 public:
   RGWMetadataManager(CephContext *_cct, RGWRados *_store);
   ~RGWMetadataManager();
@@ -344,9 +349,11 @@ public:
   int register_handler(RGWMetadataHandler *handler);
 
   template <typename F>
-  int operate(RGWMetadataHandler *handler, const string& key,
-              RGWObjVersionTracker *objv_tracker, RGWMDLogStatus op_type,
-              F&& f);
+  int mutate(RGWMetadataHandler *handler, const string& key,
+             const ceph::real_time& mtime, RGWObjVersionTracker *objv_tracker,
+             RGWMDLogStatus op_type,
+             RGWMetadataHandler::sync_type_t sync_mode,
+             F&& f);
 
   RGWMetadataHandler *get_handler(const string& type);
 
@@ -376,21 +383,30 @@ public:
 };
 
 template <typename F>
-int RGWMetadataManager::operate(RGWMetadataHandler *handler, const string& key,
-                                RGWObjVersionTracker *objv_tracker, RGWMDLogStatus op_type,
-                                F&& f)
+int RGWMetadataManager::mutate(RGWMetadataHandler *handler, const string& key,
+                               const ceph::real_time& mtime, RGWObjVersionTracker *objv_tracker,
+                               RGWMDLogStatus op_type,
+                               RGWMetadataHandler::sync_type_t sync_mode,
+                               F&& f)
 {
-  string section;
-  RGWMetadataLogData log_data;
-  int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_WRITE);
-  if (ret < 0)
-    return ret;
-
   string oid;
   rgw_pool pool;
 
   handler->get_pool_and_oid(store, key, pool, oid);
 
+  int ret = prepare_mutate(store, pool, oid, mtime, objv_tracker, sync_mode);
+  if (ret < 0 ||
+      ret == STATUS_NO_APPLY) {
+    return ret;
+  }
+
+  string section;
+  RGWMetadataLogData log_data;
+  ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_WRITE);
+  if (ret < 0) {
+    return ret;
+  }
+
   ret = std::forward<F>(f)();
 
   /* cascading ret into post_modify() */
index 12d10e8f5195f48ad2a6542be69219a773b9dcdb..55ae10f2b96f51b9dfc195f2004cc90162ab5e1e 100644 (file)
@@ -68,22 +68,14 @@ public:
       return -EINVAL;
     }
 
-    bufferlist bl;
-    real_time orig_mtime;
-    RGWObjectCtx obj_ctx(store);
-    int ret = rgw_get_system_obj(store, obj_ctx, store->get_zone_params().otp_pool,
-                                 entry, bl, &objv_tracker, &orig_mtime, nullptr, nullptr);
-    if (ret < 0 && ret != -ENOENT) {
+    int ret = store->meta_mgr->mutate(this, entry, mtime, &objv_tracker,
+                                      MDLOG_STATUS_WRITE, sync_mode,
+                                      [&] {
+         return store->set_mfa(entry, devices, true, &objv_tracker, mtime);
+    });
+    if (ret < 0) {
       return ret;
     }
-    if (ret != -ENOENT &&
-        !check_versions(objv_tracker.read_version, orig_mtime,
-                       objv_tracker.write_version, mtime, sync_mode)) {
-      return STATUS_NO_APPLY;
-    }
-    store->meta_mgr->operate(this, entry, &objv_tracker, MDLOG_STATUS_WRITE, [&] {
-         return store->set_mfa(entry, devices, true, &objv_tracker);
-    });
 
     return STATUS_APPLIED;
   }
index 9822897f0850b00db55bcb479b50dc9b30b2e312..27f2270b5fe4a43a885afa6214e96a9738a63e28 100644 (file)
@@ -14263,7 +14263,8 @@ int RGWRados::list_mfa(const rgw_user& user, list<rados::cls::otp::otp_info_t> *
 }
 
 int RGWRados::set_mfa(const string& oid, const list<rados::cls::otp::otp_info_t>& entries,
-                      bool reset_obj, RGWObjVersionTracker *objv_tracker)
+                      bool reset_obj, RGWObjVersionTracker *objv_tracker,
+                      const real_time& mtime)
 {
   rgw_raw_obj obj(get_zone_params().otp_pool, oid);
   rgw_rados_ref ref;
@@ -14294,6 +14295,8 @@ int RGWRados::set_mfa(const string& oid, const list<rados::cls::otp::otp_info_t>
     op.create(false);
   }
   ot.prepare_op_for_write(&op);
+  struct timespec mtime_ts = real_clock::to_timespec(mtime);
+  op.mtime2(&mtime_ts);
   rados::cls::otp::OTP::set(&op, entries);
   r = ref.ioctx.operate(ref.oid, &op);
   if (r < 0) {
index 574b1aa71a3af5ff5bdccbd2d8118fabac99f0b1..466f94d08959fa1bf1fd57f374ad8f23e86a176a 100644 (file)
@@ -3725,7 +3725,7 @@ public:
 
   /* mfa interfaces used by metadata engine */
   int set_mfa(const string& oid, const list<rados::cls::otp::otp_info_t>& entries, bool reset_obj,
-              RGWObjVersionTracker *objv_tracker);
+              RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime);
   int list_mfa(const string& oid, list<rados::cls::otp::otp_info_t> *result,
                RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime);
  private: