From: Yehuda Sadeh Date: Thu, 30 Nov 2017 10:29:41 +0000 (-0800) Subject: rgw: better api for metadata mutation X-Git-Tag: v13.1.0~343^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d05bf3ca97cc1d9eec77ebee13f4638b27b76d57;p=ceph.git rgw: better api for metadata mutation 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 --- diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 66aa0489eb0e..17ca865b8c86 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -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; diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index e2a4e8cab5be..82b811a65134 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -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 *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 - 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 -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)(); /* cascading ret into post_modify() */ diff --git a/src/rgw/rgw_otp.cc b/src/rgw/rgw_otp.cc index 12d10e8f5195..55ae10f2b96f 100644 --- a/src/rgw/rgw_otp.cc +++ b/src/rgw/rgw_otp.cc @@ -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; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9822897f0850..27f2270b5fe4 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -14263,7 +14263,8 @@ int RGWRados::list_mfa(const rgw_user& user, list * } int RGWRados::set_mfa(const string& oid, const list& 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 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) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 574b1aa71a3a..466f94d08959 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -3725,7 +3725,7 @@ public: /* mfa interfaces used by metadata engine */ int set_mfa(const string& oid, const list& entries, bool reset_obj, - RGWObjVersionTracker *objv_tracker); + RGWObjVersionTracker *objv_tracker, const ceph::real_time& mtime); int list_mfa(const string& oid, list *result, RGWObjVersionTracker *objv_tracker, ceph::real_time *pmtime); private: