From c04e688f01f4bba00a8e05328fa2432ec5badf80 Mon Sep 17 00:00:00 2001 From: Orit Wasserman Date: Mon, 21 Sep 2015 12:26:25 +0200 Subject: [PATCH] rgw: move zonegroup data into rgwperiodmap Signed-off-by: Orit Wasserman --- src/rgw/rgw_admin.cc | 2 +- src/rgw/rgw_json_enc.cc | 21 ++++++--- src/rgw/rgw_op.cc | 5 +- src/rgw/rgw_rados.cc | 101 ++++++++++++++++++++++++---------------- src/rgw/rgw_rados.h | 38 ++++++++------- 5 files changed, 102 insertions(+), 65 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 438b7fedee5ef..bc2b2377cab49 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -1810,7 +1810,7 @@ int main(int argc, char **argv) cerr << "could not init realm " << ": " << cpp_strerror(-ret) << std::endl; return ret; } - RGWPeriod period(master_zonegroup, master_zone); + RGWPeriod period; ret = period.init(g_ceph_context, store, realm.get_id(), realm.get_name(), false); if (ret < 0) { cerr << "failed to init period " << ": " << cpp_strerror(-ret) << std::endl; diff --git a/src/rgw/rgw_json_enc.cc b/src/rgw/rgw_json_enc.cc index e327244041cd8..01502884b8d13 100644 --- a/src/rgw/rgw_json_enc.cc +++ b/src/rgw/rgw_json_enc.cc @@ -752,7 +752,6 @@ void RGWPeriod::dump(Formatter *f) const encode_json("epoch", epoch , f); encode_json("predecessor_uuid", predecessor_uuid, f); encode_json("versions", versions, f); - encode_json("zonegroup_map", zonegroup_map, f); encode_json("master_zone", master_zone, f); } @@ -762,7 +761,6 @@ void RGWPeriod::decode_json(JSONObj *obj) JSONDecoder::decode_json("epoch", epoch, obj); JSONDecoder::decode_json("predecessor_uuid", predecessor_uuid, obj); JSONDecoder::decode_json("versions", versions, obj); - JSONDecoder::decode_json("zonegroup_map", zonegroup_map, obj); JSONDecoder::decode_json("master_zone", master_zone, obj); } @@ -900,15 +898,13 @@ void RGWZoneGroup::decode_json(JSONObj *obj) } -void RGWZoneGroupMap::dump(Formatter *f) const +void RGWPeriodMap::dump(Formatter *f) const { encode_json("zonegroups", zonegroups, f); encode_json("master_zonegroup", master_zonegroup, f); - encode_json("bucket_quota", bucket_quota, f); - encode_json("user_quota", user_quota, f); } -void RGWZoneGroupMap::decode_json(JSONObj *obj) +void RGWPeriodMap::decode_json(JSONObj *obj) { JSONDecoder::decode_json("zonegroups", zonegroups, obj); /* backward compatability with region */ @@ -920,6 +916,19 @@ void RGWZoneGroupMap::decode_json(JSONObj *obj) if (master_zonegroup.empty()) { JSONDecoder::decode_json("master_region", master_zonegroup, obj); } +} + + +void RGWZoneGroupMap::dump(Formatter *f) const +{ + encode_json("period_map", period_map, f); + encode_json("bucket_quota", bucket_quota, f); + encode_json("user_quota", user_quota, f); +} + +void RGWZoneGroupMap::decode_json(JSONObj *obj) +{ + JSONDecoder::decode_json("period_map", period_map, obj); JSONDecoder::decode_json("bucket_quota", bucket_quota, obj); JSONDecoder::decode_json("user_quota", user_quota, obj); } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 029f166bbdf73..8924dcc26c115 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -409,8 +409,9 @@ static int rgw_build_bucket_policies(RGWRados *store, struct req_state *s) s->bucket_owner = s->bucket_acl->get_owner(); string& zonegroup = s->bucket_info.zonegroup; - map::iterator dest_zonegroup = store->zonegroup_map.zonegroups.find(zonegroup); - if (dest_zonegroup != store->zonegroup_map.zonegroups.end() && !dest_zonegroup->second.endpoints.empty()) { + map::iterator dest_zonegroup = store->zonegroup_map.period_map.zonegroups.find(zonegroup); + if (dest_zonegroup != store->zonegroup_map.period_map.zonegroups.end() + && !dest_zonegroup->second.endpoints.empty()) { s->zonegroup_endpoint = dest_zonegroup->second.endpoints.front(); } if (s->bucket_exists && !store->zonegroup.equals(zonegroup)) { diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 7c72fd747ec6a..7c04916cdf900 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -984,24 +984,17 @@ int RGWZoneParams::init(CephContext *cct, RGWRados *store, RGWZoneGroup& zonegro return ret; } -void RGWZoneGroupMap::encode(bufferlist& bl) const { - ENCODE_START(3, 1, bl); +void RGWPeriodMap::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); ::encode(zonegroups, bl); ::encode(master_zonegroup, bl); - ::encode(bucket_quota, bl); - ::encode(user_quota, bl); ENCODE_FINISH(bl); } -void RGWZoneGroupMap::decode(bufferlist::iterator& bl) { - DECODE_START(3, bl); +void RGWPeriodMap::decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); ::decode(zonegroups, bl); ::decode(master_zonegroup, bl); - - if (struct_v >= 2) - ::decode(bucket_quota, bl); - if (struct_v >= 3) - ::decode(user_quota, bl); DECODE_FINISH(bl); zonegroups_by_api.clear(); @@ -1015,6 +1008,48 @@ void RGWZoneGroupMap::decode(bufferlist::iterator& bl) { } } + +int RGWPeriodMap::update(RGWZoneGroup& zonegroup) +{ + if (zonegroup.is_master && !zonegroup.equals(master_zonegroup)) { + derr << "cannot update zonegroup map, master_zonegroup conflict" << dendl; + return -EINVAL; + } + map::iterator iter = zonegroups.find(zonegroup.get_id()); + if (iter != zonegroups.end()) { + RGWZoneGroup& old_zonegroup = iter->second; + if (!old_zonegroup.api_name.empty()) { + zonegroups_by_api.erase(old_zonegroup.api_name); + } + } + zonegroups[zonegroup.get_id()] = zonegroup; + + if (!zonegroup.api_name.empty()) { + zonegroups_by_api[zonegroup.api_name] = zonegroup; + } + + if (zonegroup.is_master) { + master_zonegroup = zonegroup.get_id(); + } + return 0; +} + +void RGWZoneGroupMap::encode(bufferlist& bl) const { + ENCODE_START(4, 1, bl); + ::encode(period_map, bl); + ::encode(bucket_quota, bl); + ::encode(user_quota, bl); + ENCODE_FINISH(bl); +} + +void RGWZoneGroupMap::decode(bufferlist::iterator& bl) { + DECODE_START(4, bl); + ::decode(period_map, bl); + ::decode(bucket_quota, bl); + ::decode(user_quota, bl); + DECODE_FINISH(bl); +} + void RGWZoneGroupMap::get_params(CephContext *cct, string& pool_name, string& oid) { pool_name = cct->_conf->rgw_zone_root_pool; @@ -1026,7 +1061,9 @@ void RGWZoneGroupMap::get_params(CephContext *cct, string& pool_name, string& oi int RGWZoneGroupMap::read(CephContext *cct, RGWRados *store) { - string pool_name, oid; + Mutex::Locker l(lock); + + string pool_name, oid; get_params(cct, pool_name, oid); @@ -1039,7 +1076,6 @@ int RGWZoneGroupMap::read(CephContext *cct, RGWRados *store) return ret; - Mutex::Locker l(lock); try { bufferlist::iterator iter = bl.begin(); ::decode(*this, iter); @@ -1059,8 +1095,6 @@ int RGWZoneGroupMap::store(CephContext *cct, RGWRados *store) rgw_bucket pool(pool_name.c_str()); - Mutex::Locker l(lock); - bufferlist bl; ::encode(*this, bl); int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, 0, NULL); @@ -1072,26 +1106,15 @@ int RGWZoneGroupMap::update(RGWZoneGroup& zonegroup) { Mutex::Locker l(lock); - if (zonegroup.is_master && !zonegroup.equals(master_zonegroup)) { - derr << "cannot update zonegroup map, master_zonegroup conflict" << dendl; - return -EINVAL; - } - map::iterator iter = zonegroups.find(zonegroup.get_id()); - if (iter != zonegroups.end()) { - RGWZoneGroup& old_zonegroup = iter->second; - if (!old_zonegroup.api_name.empty()) { - zonegroups_by_api.erase(old_zonegroup.api_name); + for (map::iterator iter = periods.begin(); iter != periods.end(); iter++) + { + int ret = iter->second.update(zonegroup); + if (ret < 0) { + derr << "ERROR: failed update period " << iter->first << ":" << cpp_strerror(-ret) << dendl; + return ret; } } - zonegroups[zonegroup.get_id()] = zonegroup; - - if (!zonegroup.api_name.empty()) { - zonegroups_by_api[zonegroup.api_name] = zonegroup; - } - if (zonegroup.is_master) { - master_zonegroup = zonegroup.get_id(); - } return 0; } @@ -2707,20 +2730,20 @@ int RGWRados::init_complete() return -EIO; } } else { - string master_zonegroup = zonegroup_map.master_zonegroup; + string master_zonegroup = zonegroup_map.period_map.master_zonegroup; if (master_zonegroup.empty()) { lderr(cct) << "ERROR: zonegroup map does not specify master zonegroup" << dendl; return -EINVAL; } - map::iterator iter = zonegroup_map.zonegroups.find(master_zonegroup); - if (iter == zonegroup_map.zonegroups.end()) { + map::iterator iter = zonegroup_map.period_map.zonegroups.find(master_zonegroup); + if (iter == zonegroup_map.period_map.zonegroups.end()) { lderr(cct) << "ERROR: bad zonegroup map: inconsistent master zonegroup" << dendl; return -EINVAL; } RGWZoneGroup& zonegroup = iter->second; rest_master_conn = new RGWRESTConn(cct, this, zonegroup.endpoints); - for (iter = zonegroup_map.zonegroups.begin(); iter != zonegroup_map.zonegroups.end(); ++iter) { + for (iter = zonegroup_map.period_map.zonegroups.begin(); iter != zonegroup_map.period_map.zonegroups.end(); ++iter) { RGWZoneGroup& zonegroup = iter->second; add_new_connection_to_map(zonegroup_conn_map, zonegroup, new RGWRESTConn(cct, this, zonegroup.endpoints)); } @@ -4137,8 +4160,8 @@ int RGWRados::select_new_bucket_location(RGWUserInfo& user_info, const string& z const string& tenant_name, const string& bucket_name, rgw_bucket& bucket, string *pselected_rule) { /* first check that rule exists within the specific zonegroup */ - map::iterator riter = zonegroup_map.zonegroups.find(zonegroup_name); - if (riter == zonegroup_map.zonegroups.end()) { + map::iterator riter = zonegroup_map.period_map.zonegroups.find(zonegroup_name); + if (riter == zonegroup_map.period_map.zonegroups.end()) { ldout(cct, 0) << "could not find zonegroup " << zonegroup_name << " in zonegroup map" << dendl; return -EINVAL; } @@ -5834,7 +5857,7 @@ bool RGWRados::is_syncing_bucket_meta(rgw_bucket& bucket) } /* single zonegroup and a single zone */ - if (zonegroup_map.zonegroups.size() == 1 && zonegroup.zones.size() == 1) { + if (zonegroup_map.period_map.zonegroups.size() == 1 && zonegroup.zones.size() == 1) { return false; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 6c6d63b253a1f..112b153711846 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1129,22 +1129,34 @@ struct RGWZoneGroup : public RGWSystemMetaObj { }; WRITE_CLASS_ENCODER(RGWZoneGroup) -struct RGWZoneGroupMap { - Mutex lock; +struct RGWPeriodMap +{ map zonegroups; map zonegroups_by_api; string master_zonegroup; + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& bl); + + int update(RGWZoneGroup& zonegroup); + + void dump(Formatter *f) const; + void decode_json(JSONObj *obj); +}; +WRITE_CLASS_ENCODER(RGWPeriodMap) + +struct RGWZoneGroupMap { + Mutex lock; + RGWPeriodMap period_map; + RGWQuotaInfo bucket_quota; RGWQuotaInfo user_quota; - RGWZoneGroupMap& operator=(const RGWZoneGroupMap& zg) { - zonegroups = zg.zonegroups; - zonegroups_by_api = zg.zonegroups_by_api; - master_zonegroup = zg.master_zonegroup; - bucket_quota = zg.bucket_quota; - user_quota = zg.user_quota; + RGWZoneGroupMap& operator=(const RGWZoneGroupMap& map) { + period_map = map.period_map; + bucket_quota = map.bucket_quota; + user_quota = map.user_quota; return *this; } @@ -1272,7 +1284,7 @@ class RGWPeriod epoch_t epoch; string predecessor_uuid; map versions; - RGWZoneGroupMap zonegroup_map; + string master_zone; string realm_id; @@ -1296,17 +1308,11 @@ public: RGWPeriod(const string& period_id, epoch_t _epoch = 0) : id(period_id), epoch(_epoch) {} - RGWPeriod(const string& _master_zonegroup, const string& _master_zone) - : epoch(0), master_zone(_master_zone) { - zonegroup_map.master_zonegroup = _master_zonegroup; - } - const string& get_id() { return id;} epoch_t get_epoch() { return epoch;} const string& get_predecessor() { return predecessor_uuid;} const string& get_master_zone() { return master_zone;} const string& get_realm() { return realm_id;} - const RGWZoneGroupMap& get_zonegroup_map() { return zonegroup_map;} const string& get_pool_name(CephContext *cct); const string& get_latest_epoch_oid(); const string& get_info_oid_prefix(); @@ -1336,7 +1342,6 @@ public: ::encode(epoch, bl); ::encode(predecessor_uuid, bl); ::encode(versions, bl); - ::encode(zonegroup_map, bl); ::encode(master_zone, bl); ENCODE_FINISH(bl); } @@ -1347,7 +1352,6 @@ public: ::decode(epoch, bl); ::decode(predecessor_uuid, bl); ::decode(versions, bl); - ::decode(zonegroup_map, bl); ::decode(master_zone, bl); DECODE_FINISH(bl); } -- 2.39.5