To support dynamic resharding with multisite, each zone needs to have its own view of
"layout" to be able to manage resharding decisions independently.
Signed-off-by: Shilpa Jagannath <smanjara@redhat.com>
cerr << "ERROR: failed to read input: " << cpp_strerror(-ret) << std::endl;
return -ret;
}
- ret = store->ctl()->meta.mgr->put(metadata_key, bl, null_yield, RGWMDLogSyncType::APPLY_ALWAYS);
+ ret = store->ctl()->meta.mgr->put(metadata_key, bl, null_yield, RGWMDLogSyncType::APPLY_ALWAYS, false);
if (ret < 0) {
cerr << "ERROR: can't put key: " << cpp_strerror(-ret) << std::endl;
return -ret;
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) override;
+ RGWMDLogSyncType type, bool from_remote_zone) override;
int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
optional_yield y) override {
RGWSI_MetaBackend_Handler::Op *op, string& entry,
RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type),
+ RGWMDLogSyncType type, bool from_remote_zone) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
bhandler(_handler) {
obj = static_cast<RGWBucketEntryMetadataObject *>(_obj);
}
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type)
+ RGWMDLogSyncType type, bool from_remote_zone)
{
- RGWMetadataHandlerPut_Bucket put_op(this, op, entry, obj, objv_tracker, y, type);
+ RGWMetadataHandlerPut_Bucket put_op(this, op, entry, obj, objv_tracker, y, type, from_remote_zone);
return do_put_operate(&put_op);
}
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) override {
+ RGWMDLogSyncType type, bool from_remote_zone) override {
if (entry.find("-deleted-") != string::npos) {
RGWObjVersionTracker ot;
RGWMetadataObject *robj;
}
return RGWBucketMetadataHandler::do_put(op, entry, obj,
- objv_tracker, y, type);
+ objv_tracker, y, type, from_remote_zone);
}
};
int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType sync_type) override;
+ RGWMDLogSyncType sync_type, bool from_remote_zone) override;
int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
optional_yield y) override {
RGWBucketInstanceMetadataHandler *bihandler;
RGWBucketInstanceMetadataObject *obj;
public:
- RGWMetadataHandlerPut_BucketInstance(CephContext *cct,
+ RGWMetadataHandlerPut_BucketInstance(CephContext *_cct,
RGWBucketInstanceMetadataHandler *_handler,
RGWSI_MetaBackend_Handler::Op *_op, string& entry,
RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) : RGWMetadataHandlerPut_SObj(_handler, _op, entry, obj, objv_tracker, y, type),
- bihandler(_handler) {
+ RGWMDLogSyncType type, bool from_remote_zone) : RGWMetadataHandlerPut_SObj(_handler, _op, entry, obj, objv_tracker, y, type, from_remote_zone),
+ cct(_cct), bihandler(_handler) {
obj = static_cast<RGWBucketInstanceMetadataObject *>(_obj);
auto& bci = obj->get_bci();
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type)
+ RGWMDLogSyncType type, bool from_remote_zone)
{
RGWMetadataHandlerPut_BucketInstance put_op(svc.bucket->ctx(), this, op, entry, obj,
- objv_tracker, y, type);
+ objv_tracker, y, type, from_remote_zone);
return do_put_operate(&put_op);
}
+void init_default_bucket_layout(CephContext *cct, RGWBucketInfo& info, const RGWZone& zone) {
+ info.layout.current_index.gen = 0;
+ info.layout.current_index.layout.normal.hash_type = rgw::BucketHashType::Mod;
+ info.layout.current_index.layout.type = rgw::BucketIndexType::Normal;
+
+ info.layout.current_index.layout.normal.num_shards = (
+ cct->_conf->rgw_override_bucket_index_max_shards > 0 ?
+ cct->_conf->rgw_override_bucket_index_max_shards : zone.bucket_index_max_shards);
+}
+
int RGWMetadataHandlerPut_BucketInstance::put_check()
{
int ret;
bool exists = (!!orig_obj);
+ if (from_remote_zone) {
+ // don't sync bucket layout changes
+ if (!exists) {
+ init_default_bucket_layout(cct, bci.info, bihandler->svc.zone->get_zone());
+ } else {
+ bci.info.layout = old_bci->info.layout;
+ }
+ }
+
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 */
string tenant_name;
// conforms to the type declaration of RGWRados::check_filter_t.
extern bool rgw_bucket_object_check_filter(const string& oid);
+extern void init_default_bucket_layout(CephContext *cct, RGWBucketInfo& info, const RGWZone& zone);
+
struct RGWBucketCompleteInfo {
RGWBucketInfo info;
map<string, bufferlist> attrs;
}
int put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
- optional_yield y, RGWMDLogSyncType type) override {
+ optional_yield y, RGWMDLogSyncType type, bool from_remote_zone) override {
return -ENOTSUP;
}
string& _entry, RGWMetadataObject *_obj,
RGWObjVersionTracker& _objv_tracker,
optional_yield _y,
- RGWMDLogSyncType _type):
+ RGWMDLogSyncType _type, bool _from_remote_zone):
handler(_handler), op(_op),
entry(_entry), obj(_obj),
objv_tracker(_objv_tracker),
apply_type(_type),
- y(_y)
+ y(_y),
+ from_remote_zone(_from_remote_zone)
{
}
RGWMetadataHandlerPut_SObj::RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE *handler, RGWSI_MetaBackend_Handler::Op *op,
string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) : Put(handler, op, entry, obj, objv_tracker, y, type) {
+ RGWMDLogSyncType type, bool from_remote_zone) : Put(handler, op, entry, obj, objv_tracker, y, type, from_remote_zone) {
}
RGWMetadataHandlerPut_SObj::~RGWMetadataHandlerPut_SObj() {
});
}
-int RGWMetadataHandler_GenericMetaBE::put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, optional_yield y, RGWMDLogSyncType type)
+int RGWMetadataHandler_GenericMetaBE::put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
+ optional_yield y, RGWMDLogSyncType type, bool from_remote_zone)
{
return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
- return do_put(op, entry, obj, objv_tracker, y, type);
+ return do_put(op, entry, obj, objv_tracker, y, type, from_remote_zone);
});
}
int RGWMetadataManager::put(string& metadata_key, bufferlist& bl,
optional_yield y,
RGWMDLogSyncType sync_type,
+ bool from_remote_zone,
obj_version *existing_version)
{
RGWMetadataHandler *handler;
return -EINVAL;
}
- ret = handler->put(entry, obj, objv_tracker, y, sync_type);
+ ret = handler->put(entry, obj, objv_tracker, y, sync_type, from_remote_zone);
if (existing_version) {
*existing_version = objv_tracker.read_version;
}
virtual RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) = 0;
virtual int get(string& entry, RGWMetadataObject **obj, optional_yield) = 0;
- virtual int put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, optional_yield, RGWMDLogSyncType type) = 0;
+ virtual int put(string& entry,
+ RGWMetadataObject *obj,
+ RGWObjVersionTracker& objv_tracker,
+ optional_yield, RGWMDLogSyncType type,
+ bool from_remote_zone) = 0;
virtual int remove(string& entry, RGWObjVersionTracker& objv_tracker, optional_yield) = 0;
virtual int mutate(const string& entry,
virtual int do_get(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject **obj, optional_yield y) = 0;
virtual int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWMetadataObject *obj,
- RGWObjVersionTracker& objv_tracker, optional_yield y, RGWMDLogSyncType type) = 0;
+ RGWObjVersionTracker& objv_tracker, optional_yield y,
+ RGWMDLogSyncType type, bool from_remote_zone) = 0;
virtual int do_put_operate(Put *put_op);
virtual int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker, optional_yield y) = 0;
RGWObjVersionTracker& objv_tracker;
RGWMDLogSyncType apply_type;
optional_yield y;
+ bool from_remote_zone{false};
int get(RGWMetadataObject **obj) {
return handler->do_get(op, entry, obj, y);
Put(RGWMetadataHandler_GenericMetaBE *_handler, RGWSI_MetaBackend_Handler::Op *_op,
string& _entry, RGWMetadataObject *_obj,
RGWObjVersionTracker& _objv_tracker, optional_yield _y,
- RGWMDLogSyncType _type);
+ RGWMDLogSyncType _type, bool from_remote_zone);
virtual ~Put() {}
};
int get(string& entry, RGWMetadataObject **obj, optional_yield) override;
- int put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, optional_yield, RGWMDLogSyncType type) override;
+ int put(string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, optional_yield, RGWMDLogSyncType type, bool from_remote_zone) override;
int remove(string& entry, RGWObjVersionTracker& objv_tracker, optional_yield) override;
int mutate(const string& entry,
int get(string& metadata_key, Formatter *f, optional_yield y);
int put(string& metadata_key, bufferlist& bl, optional_yield y,
RGWMDLogSyncType sync_mode,
+ bool from_remote_zone,
obj_version *existing_version = NULL);
int remove(string& metadata_key, optional_yield y);
RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE *handler, RGWSI_MetaBackend_Handler::Op *op,
string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type);
+ RGWMDLogSyncType type, bool from_remote_zone);
~RGWMetadataHandlerPut_SObj();
int put_pre() override;
int do_put(RGWSI_MetaBackend_Handler::Op *op, string& entry,
RGWMetadataObject *_obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) override {
+ RGWMDLogSyncType type, bool from_remote_zone) override {
RGWOTPMetadataObject *obj = static_cast<RGWOTPMetadataObject *>(_obj);
RGWSI_OTP_BE_Ctx be_ctx(op->ctx());
info.owner = owner.user_id;
info.zonegroup = zonegroup_id;
info.placement_rule = selected_placement_rule;
- info.layout.current_index.layout.type = rule_info.index_type;
info.swift_ver_location = swift_ver_location;
info.swift_versioning = (!swift_ver_location.empty());
+ init_default_bucket_layout(cct, info, svc.zone->get_zone());
if (pmaster_num_shards) {
+ // TODO: remove this once sync doesn't require the same shard count
info.layout.current_index.layout.normal.num_shards = *pmaster_num_shards;
- } else {
- info.layout.current_index.layout.normal.num_shards = bucket_index_max_shards;
}
- info.layout.current_index.layout.normal.hash_type = rgw::BucketHashType::Mod;
+ info.layout.current_index.layout.type = rule_info.index_type;
info.requester_pays = false;
if (real_clock::is_zero(creation_time)) {
info.creation_time = ceph::real_clock::now();
bufferlist bl;
protected:
int _send_request() override {
- int ret = store->ctl()->meta.mgr->put(raw_key, bl, null_yield, RGWMDLogSyncType::APPLY_ALWAYS);
+ int ret = store->ctl()->meta.mgr->put(raw_key, bl, null_yield, RGWMDLogSyncType::APPLY_ALWAYS, true);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: can't store key: " << raw_key << " ret=" << ret << dendl;
return ret;
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) override;
+ RGWMDLogSyncType type, bool from_remote_zone) override;
int do_remove(RGWSI_MetaBackend_Handler::Op *op, string& entry, RGWObjVersionTracker& objv_tracker,
optional_yield y) override {
RGWSI_MetaBackend_Handler::Op *op, string& entry,
RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type),
+ RGWMDLogSyncType type, bool from_remote_zone) : RGWMetadataHandlerPut_SObj(_handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
uhandler(_handler) {
uobj = static_cast<RGWUserMetadataObject *>(obj);
}
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
- RGWMDLogSyncType type)
+ RGWMDLogSyncType type, bool from_remote_zone)
{
- RGWMetadataHandlerPut_User put_op(this, op, entry, obj, objv_tracker, y, type);
+ RGWMetadataHandlerPut_User put_op(this, op, entry, obj, objv_tracker, y, type, from_remote_zone);
return do_put_operate(&put_op);
}