Skip to content

Instantly share code, notes, and snippets.

@clayg
Created September 16, 2016 01:42
Show Gist options
  • Save clayg/9d6e32f1a9eabbfa1aa6c61c53a87915 to your computer and use it in GitHub Desktop.
Save clayg/9d6e32f1a9eabbfa1aa6c61c53a87915 to your computer and use it in GitHub Desktop.
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