diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-07-26 18:15:32 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-07-29 15:11:41 -0700 |
commit | eb6e6da1a90d3d94d623650556d78e56d04ab3a1 (patch) | |
tree | 332c3990d60ec5489c6c14a5351214f62ee00923 | |
parent | f10c2e746ef5b9921b808450e75f2a90070e05bc (diff) | |
download | ceph-eb6e6da1a90d3d94d623650556d78e56d04ab3a1.tar.gz |
rgw: keep a region connection map
Fixes: #5793
Beforehand all remote copies were going to the master region
which was awfully wrong.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/rgw/rgw_rados.cc | 23 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 1 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9e8f5637415..7131df9eaeb 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -831,6 +831,11 @@ void RGWRados::finalize() RGWRESTConn *conn = iter->second; delete conn; } + + for (iter = region_conn_map.begin(); iter != region_conn_map.end(); ++iter) { + RGWRESTConn *conn = iter->second; + delete conn; + } } /** @@ -896,6 +901,12 @@ int RGWRados::init_complete() } RGWRegion& region = iter->second; rest_master_conn = new RGWRESTConn(cct, this, region.endpoints); + + for (iter = region_map.regions.begin(); iter != region_map.regions.end(); ++iter) { + RGWRegion& region = iter->second; + + region_conn_map[region.name] = new RGWRESTConn(cct, this, region.endpoints); + } } map<string, RGWZone>::iterator ziter; @@ -2535,7 +2546,17 @@ int RGWRados::copy_obj(void *ctx, RGWRESTConn *conn; if (source_zone.empty()) { - conn = rest_master_conn; + if (dest_bucket_info.region.empty()) { + /* source is in the master region */ + conn = rest_master_conn; + } else { + map<string, RGWRESTConn *>::iterator iter = region_conn_map.find(src_bucket_info.region); + if (iter == zone_conn_map.end()) { + ldout(cct, 0) << "could not find region connection to region: " << source_zone << dendl; + return -ENOENT; + } + conn = iter->second; + } } else { map<string, RGWRESTConn *>::iterator iter = zone_conn_map.find(source_zone); if (iter == zone_conn_map.end()) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 099a7112514..d01f76ec224 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -888,6 +888,7 @@ public: RGWRegionMap region_map; RGWRESTConn *rest_master_conn; map<string, RGWRESTConn *> zone_conn_map; + map<string, RGWRESTConn *> region_conn_map; RGWMetadataManager *meta_mgr; |