Created
September 16, 2016 01:42
-
-
Save clayg/9d6e32f1a9eabbfa1aa6c61c53a87915 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/swift/proxy/controllers/obj.py b/swift/proxy/controllers/obj.py | |
index 19a913d..548f405 100644 | |
--- a/swift/proxy/controllers/obj.py | |
+++ b/swift/proxy/controllers/obj.py | |
@@ -1936,17 +1936,21 @@ class ECObjectController(BaseObjectController): | |
policy) | |
bad_gets = [] | |
- etag_buckets = collections.defaultdict(list) | |
+ etag_buckets = collections.defaultdict(dict) | |
best_etag = None | |
for get, parts_iter in pile: | |
if is_success(get.last_status): | |
- etag = HeaderKeyDict( | |
- get.last_headers)['X-Object-Sysmeta-Ec-Etag'] | |
- etag_buckets[etag].append((get, parts_iter)) | |
- if etag != best_etag and ( | |
- len(etag_buckets[etag]) > | |
- len(etag_buckets[best_etag])): | |
- best_etag = etag | |
+ headers = HeaderKeyDict(get.last_headers) | |
+ etag = headers['X-Object-Sysmeta-Ec-Etag'] | |
+ frag_index = headers.get( | |
+ 'X-Object-Sysmeta-Ec-Frag-Index') | |
+ if frag_index and ( | |
+ frag_index not in etag_buckets): | |
+ etag_buckets[etag][frag_index] = (get, parts_iter) | |
+ if etag != best_etag and ( | |
+ len(etag_buckets[etag]) > | |
+ len(etag_buckets[best_etag])): | |
+ best_etag = etag | |
else: | |
bad_gets.append((get, parts_iter)) | |
matching_response_count = max( | |
@@ -1963,7 +1967,7 @@ class ECObjectController(BaseObjectController): | |
if len(etag_buckets[best_etag]) >= policy.ec_ndata: | |
# headers can come from any of the getters | |
resp_headers = HeaderKeyDict( | |
- etag_buckets[best_etag][0][0].source_headers[-1]) | |
+ etag_buckets[best_etag].values()[0][0].source_headers[-1]) | |
resp_headers.pop('Content-Range', None) | |
eccl = resp_headers.get('X-Object-Sysmeta-Ec-Content-Length') | |
obj_length = int(eccl) if eccl is not None else None | |
@@ -1974,7 +1978,8 @@ class ECObjectController(BaseObjectController): | |
app_iter = ECAppIter( | |
req.swift_entity_path, | |
policy, | |
- [iterator for getter, iterator in etag_buckets[best_etag]], | |
+ [iterator for getter, iterator | |
+ in etag_buckets[best_etag].values()], | |
range_specs, fa_length, obj_length, | |
self.app.logger) | |
resp = Response( |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment