From: Yehuda Sadeh Date: Fri, 31 May 2019 00:20:53 +0000 (-0700) Subject: rgw: bucket: metadata handler, fix put X-Git-Tag: v15.1.0~1898^2^2~71 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9b7d062d8b3b3d23fb26d14e7c6432dee84b9bf9;p=ceph-ci.git rgw: bucket: metadata handler, fix put Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 02c4754bd5c..3c1562ae281 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -2393,7 +2393,7 @@ public: obj->get_ep().encode(*bl); } - int put_checked(RGWMetadataObject *_old_obj) override; + int put_checked() override; int put_post() override; }; @@ -2406,11 +2406,13 @@ int RGWBucketMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op, string& return do_put_operate(&put_op); } -int RGWMetadataHandlerPut_Bucket::put_checked(RGWMetadataObject *_old_obj) +int RGWMetadataHandlerPut_Bucket::put_checked() { - RGWBucketEntryMetadataObject *old_obj = static_cast(_old_obj); + RGWBucketEntryMetadataObject *orig_obj = static_cast(old_obj); - obj->set_pattrs(&old_obj->get_attrs()); + if (orig_obj) { + obj->set_pattrs(&orig_obj->get_attrs()); + } auto& be = obj->get_ep(); auto mtime = obj->get_mtime(); @@ -2767,7 +2769,7 @@ public: obj->get_bucket_info().encode(*bl); } - int put_pre() override; + int put_check() override; int put_post() override; }; @@ -2783,17 +2785,17 @@ int RGWBucketInstanceMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op, return do_put_operate(&put_op); } -int RGWMetadataHandlerPut_BucketInstance::put_pre() +int RGWMetadataHandlerPut_BucketInstance::put_check() { int ret; RGWBucketCompleteInfo& bci = obj->get_bci(); - RGWBucketInstanceMetadataObject *old_obj = static_cast(_old_obj); + RGWBucketInstanceMetadataObject *orig_obj = static_cast(old_obj); - RGWBucketCompleteInfo *old_bci = (old_obj ? &old_obj->get_bci() : nullptr); + RGWBucketCompleteInfo *old_bci = (orig_obj ? &orig_obj->get_bci() : nullptr); - bool exists = (!!old_obj); + bool exists = (!!orig_obj); if (!exists || old_bci->info.bucket.bucket_id != bci.info.bucket.bucket_id) { /* a new bucket, we need to select a new bucket placement for it */ diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 4f9a1fc458f..464a6678472 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -392,23 +392,35 @@ RGWMetadataHandler_GenericMetaBE::Put::Put(RGWMetadataHandler_GenericMetaBE *_ha { } -int RGWMetadataHandlerPut_SObj::put() +RGWMetadataHandlerPut_SObj::RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE *handler, RGWSI_MetaBackend_Handler::Op *op, + string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, + RGWMDLogSyncType type) : Put(handler, op, entry, obj, objv_tracker, type) { +} + +RGWMetadataHandlerPut_SObj::~RGWMetadataHandlerPut_SObj() { +} + +int RGWMetadataHandlerPut_SObj::put_pre() { - RGWMetadataObject *old_obj{nullptr}; #warning what about attrs? map attrs; - int ret = get(&old_obj); + int ret = get(entry, &old_obj); if (ret < 0 && ret != -ENOENT) { return ret; } + exists = (ret != -ENOENT); - std::unique_ptr oo(old_obj); + oo.reset(old_obj); + return 0; +} + +int RGWMetadataHandlerPut_SObj::put_check() +{ auto old_ver = (!old_obj ? obj_version() : old_obj->get_version()); auto old_mtime = (!old_obj ? ceph::real_time() : old_obj->get_mtime()); // are we actually going to perform this put, or is it too old? - bool exists = (ret != -ENOENT); if (!handler->check_versions(exists, old_ver, old_mtime, objv_tracker.write_version, obj->get_mtime(), apply_type)) { @@ -417,10 +429,20 @@ int RGWMetadataHandlerPut_SObj::put() objv_tracker.read_version = old_ver; /* maintain the obj version we just read */ - return put_checked(old_obj); + return 0; +} + +int RGWMetadataHandlerPut_SObj::put() +{ + int ret = put_check(); + if (ret != 0) { + return ret; + } + + return put_checked(); } -int RGWMetadataHandlerPut_SObj::put_checked(RGWMetadataObject *_old_obj) +int RGWMetadataHandlerPut_SObj::put_checked() { RGWSI_MBSObj_PutParams params(obj->get_pattrs(), obj->get_mtime()); @@ -773,9 +795,3 @@ void RGWMetadataManager::get_sections(list& sections) } } -int RGWMetadataManager::get_log_shard_id(const string& hash_key, - int *shard_id) -{ - *shard_id = rgw_shard_id(hash_key, cct->_conf->rgw_md_log_max_shards); - return 0; -} diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index aff8a5ff2c8..2163b614e70 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -216,22 +216,26 @@ public: void get_sections(list& sections); - int get_log_shard_id(const string& hash_key, int *shard_id); - void parse_metadata_key(const string& metadata_key, string& type, string& entry); }; class RGWMetadataHandlerPut_SObj : public RGWMetadataHandler_GenericMetaBE::Put { +protected: + std::unique_ptr oo; + RGWMetadataObject *old_obj{nullptr}; + bool exists{false}; + public: RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE *handler, RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, - RGWMDLogSyncType type) : Put(handler, op, entry, obj, objv_tracker, type) {} - ~RGWMetadataHandlerPut_SObj() {} + RGWMDLogSyncType type); + ~RGWMetadataHandlerPut_SObj(); + int put_pre() override; int put() override; - - virtual int put_checked(RGWMetadataObject *_old_obj); + virtual int put_check(); + virtual int put_checked(); virtual void encode_obj(bufferlist *bl) {} }; diff --git a/src/rgw/services/svc_mdlog.cc b/src/rgw/services/svc_mdlog.cc index 0a227967935..4dc0fcd9962 100644 --- a/src/rgw/services/svc_mdlog.cc +++ b/src/rgw/services/svc_mdlog.cc @@ -356,5 +356,5 @@ RGWMetadataLog* RGWSI_MDLog::get_log(const std::string& period) int RGWSI_MDLog::add_entry(RGWSI_MetaBackend::Module *module, const string& section, const string& key, bufferlist& bl) { ceph_assert(current_log); // must have called init() - return current_log->add_entry(module, section, key, bl); + return current_log->add_entry(module->get_hash_key(secrion, key), section, key, bl); } diff --git a/src/rgw/services/svc_meta_be.h b/src/rgw/services/svc_meta_be.h index 5d0e216ef6d..0232b396eae 100644 --- a/src/rgw/services/svc_meta_be.h +++ b/src/rgw/services/svc_meta_be.h @@ -70,6 +70,14 @@ public: */ public: virtual ~Module() = 0; + + /* + * return key used for hashing specific section and key. Needed for determining where + * to store mdlog entries, e.g., bucket.index entries will be stored without using + * the bucket id, to ensure that bucket and bucket.instance of the same Bucket go to the + * same place. + */ + virtual std::string get_hash_key(const std::string& section, const std::string& key) = 0; }; using ModuleRef = std::shared_ptr;