encode_obj(¶ms.bl);
- int ret = op->put(entry, params, &objv_tracker, y, apply_type);
+ int ret = op->put(entry, params, &objv_tracker, y);
if (ret < 0) {
return ret;
}
const string prefix;
public:
- RGWSI_Bucket_Module(RGWSI_Bucket::Svc& _svc) : svc(_svc) {}
+ RGWSI_Bucket_Module(RGWSI_Bucket::Svc& _svc) : RGWSI_MBSObj_Handler_Module("bucket"),
+ svc(_svc) {}
void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) override {
if (pool) {
const string prefix;
public:
- RGWSI_BucketInstance_Module(RGWSI_Bucket::Svc& _svc) : svc(_svc), prefix(RGW_BUCKET_INSTANCE_MD_PREFIX) {}
+ RGWSI_BucketInstance_Module(RGWSI_Bucket::Svc& _svc) : RGWSI_MBSObj_Handler_Module("bucket.instance"),
+ svc(_svc), prefix(RGW_BUCKET_INSTANCE_MD_PREFIX) {}
void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) override {
if (pool) {
* point, so that the log entries end up at the same log shard, so that we process them
* in order
*/
- string get_hash_key(const string& section, const string& key) override {
+ string get_hash_key(const string& key) override {
string k = "bucket:";
int pos = key.find(':');
if (pos < 0)
return &insert.first->second;
}
-int RGWSI_MDLog::add_entry(RGWSI_MetaBackend::Module *module, const string& section, const string& key, bufferlist& bl)
+int RGWSI_MDLog::add_entry(const string& hash_key, const string& section, const string& key, bufferlist& bl)
{
ceph_assert(current_log); // must have called init()
- return current_log->add_entry(module->get_hash_key(secrion, key), section, key, bl);
+ return current_log->add_entry(hash_key, section, key, bl);
}
RGWObjVersionTracker *objv_tracker,
bool exclusive = false);
- int add_entry(RGWSI_MetaBackend::Module *module, const string& section, const string& key, bufferlist& bl);
+ int add_entry(const string& hash_key, const string& section, const string& key, bufferlist& bl);
RGWPeriodHistory *get_period_history() {
return period_history.get();
#include "svc_meta_be.h"
-#include "svc_mdlog.h"
#include "rgw/rgw_mdlog.h"
const string& key,
RGWMetadataLogData& log_data,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogStatus op_type)
+ RGWMDLogStatus op_type,
+ optional_yield y)
{
/* if write version has not been set, and there's a read version, set it so that we can
* log it
*/
- if (objv_tracker) {
- if (objv_tracker->read_version.ver && !objv_tracker->write_version.ver) {
- objv_tracker->write_version = objv_tracker->read_version;
- objv_tracker->write_version.ver++;
- }
- log_data.read_version = objv_tracker->read_version;
- log_data.write_version = objv_tracker->write_version;
+ if (objv_tracker &&
+ objv_tracker->read_version.ver && !objv_tracker->write_version.ver) {
+ objv_tracker->write_version = objv_tracker->read_version;
+ objv_tracker->write_version.ver++;
}
- log_data.status = op_type;
-
- bufferlist logbl;
- encode(log_data, logbl);
-
- int ret = mdlog_svc->add_entry(ctx->module, ctx->section, key, logbl);
- if (ret < 0)
- return ret;
-
return 0;
}
int RGWSI_MetaBackend::post_modify(RGWSI_MetaBackend::Context *ctx,
const string& key,
RGWMetadataLogData& log_data,
- RGWObjVersionTracker *objv_tracker, int ret)
+ RGWObjVersionTracker *objv_tracker, int ret,
+ optional_yield y)
{
- if (ret >= 0)
- log_data.status = MDLOG_STATUS_COMPLETE;
- else
- log_data.status = MDLOG_STATUS_ABORT;
-
- bufferlist logbl;
- encode(log_data, logbl);
-
- int r = mdlog_svc->add_entry(ctx->module, ctx->section, key, logbl);
- if (ret < 0)
- return ret;
-
- if (r < 0)
- return r;
-
- return 0;
+ return ret;
}
int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context *ctx,
const string& key,
const real_time& mtime,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode)
+ optional_yield y)
{
real_time orig_mtime;
unique_ptr<GetParams> params(alloc_default_get_params(&orig_mtime));
- int ret = get_entry(ctx, key, *params, objv_tracker);
+ int ret = get_entry(ctx, key, *params, objv_tracker, y);
if (ret < 0 && ret != -ENOENT) {
return ret;
}
- bool exists = (ret != -ENOENT);
- if (!RGWMetadataHandler::check_versions(exists, objv_tracker->read_version, orig_mtime,
- objv_tracker->write_version, mtime, sync_mode)) {
- return STATUS_NO_APPLY;
- }
if (objv_tracker->write_version.tag.empty()) {
if (objv_tracker->read_version.tag.empty()) {
const ceph::real_time& mtime,
RGWObjVersionTracker *objv_tracker,
RGWMDLogStatus op_type,
- RGWMDLogSyncType sync_mode,
std::function<int()> f,
- bool generic_prepare)
+ bool generic_prepare,
+ optional_yield y)
{
int ret;
if (generic_prepare) {
- ret = prepare_mutate(ctx, key, mtime, objv_tracker, sync_mode);
+ ret = prepare_mutate(ctx, key, mtime, objv_tracker, y);
if (ret < 0 ||
ret == STATUS_NO_APPLY) {
return ret;
}
RGWMetadataLogData log_data;
- ret = pre_modify(ctx, key, log_data, objv_tracker, op_type);
+ ret = pre_modify(ctx, key, log_data, objv_tracker, op_type, y);
if (ret < 0) {
return ret;
}
/* cascading ret into post_modify() */
- ret = post_modify(ctx, key, log_data, objv_tracker, ret);
+ ret = post_modify(ctx, key, log_data, objv_tracker, ret, y);
if (ret < 0)
return ret;
int RGWSI_MetaBackend::get(Context *ctx,
const string& key,
GetParams& params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
- return get_entry(ctx, key, params, objv_tracker);
+ return get_entry(ctx, key, params, objv_tracker, y);
}
int RGWSI_MetaBackend::put(Context *ctx,
const string& key,
PutParams& params,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode)
+ optional_yield y)
{
std::function<int()> f = [&]() {
- return put_entry(ctx, key, params, objv_tracker);
+ return put_entry(ctx, key, params, objv_tracker, y);
};
return mutate(ctx, key, params.mtime, objv_tracker,
- MDLOG_STATUS_WRITE, sync_mode,
+ MDLOG_STATUS_WRITE,
f,
- false);
+ false,
+ y);
}
int RGWSI_MetaBackend::remove(Context *ctx,
const string& key,
RemoveParams& params,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode)
+ optional_yield y)
{
std::function<int()> f = [&]() {
- return remove_entry(ctx, key, params, objv_tracker);
+ return remove_entry(ctx, key, params, objv_tracker, y);
};
return mutate(ctx, key, params.mtime, objv_tracker,
- MDLOG_STATUS_REMOVE, sync_mode,
+ MDLOG_STATUS_REMOVE,
f,
- false);
+ false,
+ y);
}
const std::string& key,
const ceph::real_time& mtime,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode);
+ optional_yield y);
virtual int mutate(Context *ctx,
const std::string& key,
const ceph::real_time& mtime, RGWObjVersionTracker *objv_tracker,
RGWMDLogStatus op_type,
- RGWMDLogSyncType sync_mode,
std::function<int()> f,
- bool generic_prepare);
+ bool generic_prepare,
+ optional_yield y);
virtual int pre_modify(Context *ctx,
const std::string& key,
RGWMetadataLogData& log_data,
RGWObjVersionTracker *objv_tracker,
- RGWMDLogStatus op_type);
+ RGWMDLogStatus op_type,
+ optional_yield y);
virtual int post_modify(Context *ctx,
const std::string& key,
RGWMetadataLogData& log_data,
- RGWObjVersionTracker *objv_tracker, int ret);
+ RGWObjVersionTracker *objv_tracker, int ret,
+ optional_yield y);
public:
class Module {
/*
*/
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>;
const std::string& key,
PutParams& params,
RGWObjVersionTracker *objv_tracker,
- optional_yield y,
- RGWMDLogSyncType sync_mode);
+ optional_yield y);
virtual int remove(Context *ctx,
const std::string& key,
RemoveParams& params,
RGWObjVersionTracker *objv_tracker,
- optional_yield y,
- RGWMDLogSyncType sync_mode);
-
+ optional_yield y);
};
class RGWSI_MetaBackend_Handler {
int put(const std::string& key,
RGWSI_MetaBackend::PutParams& params,
- RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode) {
- return be->put(be_ctx, key, params, objv_tracker, sync_mode);
+ RGWObjVersionTracker *objv_tracker) {
+ return be->put(be_ctx, key, params, objv_tracker);
}
int remove(const std::string& key,
RGWSI_MetaBackend::RemoveParams& params,
- RGWObjVersionTracker *objv_tracker,
- RGWMDLogSyncType sync_mode) {
- return be->remove(be_ctx, key, params, objv_tracker, sync_mode);
+ RGWObjVersionTracker *objv_tracker) {
+ return be->remove(be_ctx, key, params, objv_tracker);
}
int list_init(const string& marker) {
int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
RGWSI_MetaBackend::GetParams& _params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
RGWSI_MetaBackend_SObj::Context_OTP *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_OTP *>(_ctx);
RGWSI_MBOTP_GetParams& params = static_cast<RGWSI_MBOTP_GetParams&>(_params);
- int r = svc.cls->mfa.list_mfa(ctx->key, params.pdevices, objv_tracker, params.pmtime, null_yield);
+ int r = svc.cls->mfa.list_mfa(ctx->key, params.pdevices, objv_tracker, params.pmtime, y);
if (r < 0) {
return r;
}
int RGWSI_MetaBackend_SObj::put_entry(RGWSI_MetaBackend::Context *_ctx,
RGWSI_MetaBackend::PutParams& _params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
RGWSI_MetaBackend_OTP::Context_OTP *ctx = static_cast<RGWSI_MetaBackend_OTP::Context_OTP *>(_ctx);
RGWSI_MBOTP_PutParams& params = static_cast<RGWSI_MBOTP_PutParams&>(_params);
- return svc.cls->mfa.set_mfa(ctx->key, params.devices, true, &objv_tracker, mtime, null_yield);
+ return svc.cls->mfa.set_mfa(ctx->key, params.devices, true, &objv_tracker, mtime, y);
}
cls_svc = _cls_svc;
}
- void init_ctx(RGWSI_MetaBackend_Handle handle, RGWSI_MetaBackend::Context *ctx) override;
-
RGWSI_MetaBackend::GetParams *alloc_default_get_params(ceph::real_time *pmtime) override;
int get_entry(RGWSI_MetaBackend::Context *ctx,
+ const string& key,
RGWSI_MetaBackend::GetParams& _params,
- RGWObjVersionTracker *objv_tracker);
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y);
int put_entry(RGWSI_MetaBackend::Context *ctx,
+ const string& key,
RGWSI_MetaBackend::PutParams& _params,
- RGWObjVersionTracker *objv_tracker);
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y);
};
#include "svc_meta_be_sobj.h"
+#include "svc_mdlog.h"
#include "rgw/rgw_tools.h"
#include "rgw/rgw_metadata.h"
RGWSI_MetaBackend::Context *RGWSI_MetaBackend_SObj::alloc_ctx()
{
- return new ctx(sysobj_svc);
+ return new Context_SObj(sysobj_svc);
+}
+
+int RGWSI_MetaBackend_SObj::pre_modify(RGWSI_MetaBackend::Context *_ctx,
+ const string& key,
+ RGWMetadataLogData& log_data,
+ RGWObjVersionTracker *objv_tracker,
+ RGWMDLogStatus op_type,
+ optional_yield y)
+{
+ auto ctx = static_cast<Context_SObj *>(_ctx);
+ int ret = RGWSI_MetaBackend::pre_modify(ctx, key, log_data,
+ objv_tracker, op_type,
+ y);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* if write version has not been set, and there's a read version, set it so that we can
+ * log it
+ */
+ if (objv_tracker) {
+ log_data.read_version = objv_tracker->read_version;
+ log_data.write_version = objv_tracker->write_version;
+ }
+
+ log_data.status = op_type;
+
+ bufferlist logbl;
+ encode(log_data, logbl);
+
+ ret = mdlog_svc->add_entry(ctx->module->get_hash_key(key), ctx->module->get_section(), key, logbl);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+int RGWSI_MetaBackend_SObj::post_modify(RGWSI_MetaBackend::Context *_ctx,
+ const string& key,
+ RGWMetadataLogData& log_data,
+ RGWObjVersionTracker *objv_tracker, int ret,
+ optional_yield y)
+{
+ auto ctx = static_cast<Context_SObj *>(_ctx);
+ if (ret >= 0)
+ log_data.status = MDLOG_STATUS_COMPLETE;
+ else
+ log_data.status = MDLOG_STATUS_ABORT;
+
+ bufferlist logbl;
+ encode(log_data, logbl);
+
+ int r = mdlog_svc->add_entry(ctx->module->get_hash_key(key), ctx->module->get_section(), key, logbl);
+ if (ret < 0)
+ return ret;
+
+ if (r < 0)
+ return r;
+
+ return RGWSI_MetaBackend::post_modify(ctx, key, log_data, objv_tracker, ret, y);
}
int RGWSI_MetaBackend_SObj::call(std::function<int(RGWSI_MetaBackend::Context *)> f)
int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
const string& key,
GetParams& _params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
RGWSI_MBSObj_GetParams& params = static_cast<RGWSI_MBSObj_GetParams&>(_params);
return rgw_get_system_obj(*ctx->obj_ctx, pool, oid, *params.pbl,
objv_tracker, params.pmtime,
- params.y,
+ y,
params.pattrs, params.cache_info,
params.refresh_version);
}
int RGWSI_MetaBackend_SObj::put_entry(RGWSI_MetaBackend::Context *_ctx,
const string& key,
PutParams& _params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
RGWSI_MBSObj_PutParams& params = static_cast<RGWSI_MBSObj_PutParams&>(_params);
ctx->module->get_pool_and_oid(key, &pool, &oid);
return rgw_put_system_obj(*ctx->obj_ctx, pool, oid, params.bl, params.exclusive,
- objv_tracker, params.mtime, params.y, params.pattrs);
+ objv_tracker, params.mtime, y, params.pattrs);
}
int RGWSI_MetaBackend_SObj::remove_entry(RGWSI_MetaBackend::Context *_ctx,
const string& key,
RemoveParams& params,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y)
{
RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
auto sysobj = ctx->obj_ctx->get_obj(k);
return sysobj.wop()
.set_objv_tracker(objv_tracker)
- .remove(params.y);
+ .remove(y);
}
int RGWSI_MetaBackend_SObj::list_init(RGWSI_MetaBackend::Context *_ctx,
ctx->list.pool = sysobj_svc->get_pool(pool);
ctx->list.op.emplace(ctx->list.pool->op());
- string prefix = ctx->module->get_prefix();
+ string prefix = ctx->module->get_oid_prefix();
ctx->list.op->init(marker, prefix);
return 0;
class RGWSI_MBSObj_Handler_Module : public RGWSI_MetaBackend::Module {
+protected:
+ string section;
public:
+ RGWSI_MBSObj_Handler_Module(const string& _section) : section(_section) {}
virtual void get_pool_and_oid(const std::string& key, rgw_pool *pool, std::string *oid) = 0;
virtual const std::string& get_oid_prefix() = 0;
virtual std::string key_to_oid(const std::string& key) = 0;
virtual bool is_valid_oid(const std::string& oid) = 0;
virtual std::string oid_to_key(const std::string& oid) = 0;
+ const std::string& get_section() {
+ return section;
+ }
+
/* key to use for hashing entries for log shard placement */
- virtual std::string get_hash_key(const std::string& section, const std::string& key) {
+ virtual std::string get_hash_key(const std::string& key) {
return section + ":" + key;
}
};
RGWSI_MetaBackend::GetParams *alloc_default_get_params(ceph::real_time *pmtime) override;
+ int pre_modify(RGWSI_MetaBackend::Context *ctx,
+ const string& key,
+ RGWMetadataLogData& log_data,
+ RGWObjVersionTracker *objv_tracker,
+ RGWMDLogStatus op_type,
+ optional_yield y);
+ int post_modify(RGWSI_MetaBackend::Context *ctx,
+ const string& key,
+ RGWMetadataLogData& log_data,
+ RGWObjVersionTracker *objv_tracker, int ret,
+ optional_yield y);
+
int get_entry(RGWSI_MetaBackend::Context *ctx,
const string& key,
RGWSI_MetaBackend::GetParams& params,
- RGWObjVersionTracker *objv_tracker) override;
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y) override;
int put_entry(RGWSI_MetaBackend::Context *ctx,
const string& key,
RGWSI_MetaBackend::PutParams& params,
- RGWObjVersionTracker *objv_tracker) override;
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y) override;
int remove_entry(RGWSI_MetaBackend::Context *ctx,
const string& key,
RGWSI_MetaBackend::RemoveParams& params,
- RGWObjVersionTracker *objv_tracker) override;
+ RGWObjVersionTracker *objv_tracker,
+ optional_yield y) override;
int list_init(RGWSI_MetaBackend::Context *_ctx, const string& marker) override;
int list_next(RGWSI_MetaBackend::Context *_ctx,
const string prefix;
public:
- RGWSI_User_Module(RGWSI_User_RADOS::Svc& _svc) : svc(_svc) {}
+ RGWSI_User_Module(RGWSI_User_RADOS::Svc& _svc) : RGWSI_MBSObj_Handler_Module("user"),
+ svc(_svc) {}
void get_pool_and_oid(const string& key, rgw_pool *pool, string *oid) override {
if (pool) {