obj->get_ep().encode(*bl);
}
- int put_checked(RGWMetadataObject *_old_obj) override;
+ int put_checked() override;
int put_post() override;
};
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();
obj->get_bucket_info().encode(*bl);
}
- int put_pre() override;
+ int put_check() override;
int put_post() override;
};
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 */
{
}
-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)) {
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());
}
}
-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;
-}
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) {}
};
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);
}
*/
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>;