]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: bucket: metadata handler, fix put
authorYehuda Sadeh <yehuda@redhat.com>
Fri, 31 May 2019 00:20:53 +0000 (17:20 -0700)
committerCasey Bodley <cbodley@redhat.com>
Mon, 29 Jul 2019 19:20:48 +0000 (15:20 -0400)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_metadata.cc
src/rgw/rgw_metadata.h
src/rgw/services/svc_mdlog.cc
src/rgw/services/svc_meta_be.h

index 02c4754bd5c1d8376c68e7d231913b7ad5d6efdb..3c1562ae281f96fa25fecd9c11689df6a497a940 100644 (file)
@@ -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<RGWBucketEntryMetadataObject *>(_old_obj);
+  RGWBucketEntryMetadataObject *orig_obj = static_cast<RGWBucketEntryMetadataObject *>(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<RGWBucketInstanceMetadataObject *>(_old_obj);
+  RGWBucketInstanceMetadataObject *orig_obj = static_cast<RGWBucketInstanceMetadataObject *>(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 */
index 4f9a1fc458f5c31f6d471718b2c54de1d7667776..464a6678472a6590740fcb4c133a1dc274f3043a 100644 (file)
@@ -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<string, bufferlist> 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<RGWMetadataObject> 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<string>& 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;
-}
index aff8a5ff2c849db6df8d2a11fb7cfa7e39ebff4a..2163b614e70e9d6bce5c2bf120d77757071646e4 100644 (file)
@@ -216,22 +216,26 @@ public:
 
   void get_sections(list<string>& 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<RGWMetadataObject> 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) {}
 };
 
index 0a227967935d670930e101e95eebe45216086648..4dc0fcd9962d92e28b4fb69153ad71635efc1f3a 100644 (file)
@@ -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);
 }
index 5d0e216ef6dd6690a8b66a702c7b2ca68dcb4bb8..0232b396eae87b129281a8845a11536f2699d6a6 100644 (file)
@@ -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<Module>;