summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-07-02 00:04:50 +0000
committerGerrit Code Review <review@openstack.org>2015-07-02 00:04:50 +0000
commit0df888ea5527214621649604054076b03045cd7a (patch)
treebb4cd0bcdd08f457893fe6ec6dfa5353e1fa0de9
parent70afe207cf1022e120c49622b3e6a9740cf2eb05 (diff)
parentd931ec1381b6160c06036c6038f247c8619392ef (diff)
downloadpython-swiftclient-0df888ea5527214621649604054076b03045cd7a.tar.gz
Merge "Remove all DLO segments on upload of replacement"
-rw-r--r--swiftclient/service.py32
-rw-r--r--tests/unit/test_shell.py16
2 files changed, 29 insertions, 19 deletions
diff --git a/swiftclient/service.py b/swiftclient/service.py
index 2760a08..ba21a49 100644
--- a/swiftclient/service.py
+++ b/swiftclient/service.py
@@ -1815,19 +1815,19 @@ class SwiftService(object):
if old_manifest or old_slo_manifest_paths:
drs = []
+ delobjsmap = {}
if old_manifest:
scontainer, sprefix = old_manifest.split('/', 1)
scontainer = unquote(scontainer)
sprefix = unquote(sprefix).rstrip('/') + '/'
- delobjs = []
- for delobj in conn.get_container(scontainer,
- prefix=sprefix)[1]:
- delobjs.append(delobj['name'])
- for dr in self.delete(container=scontainer,
- objects=delobjs):
- drs.append(dr)
+ delobjsmap[scontainer] = []
+ for part in self.list(scontainer, {'prefix': sprefix}):
+ if not part["success"]:
+ raise part["error"]
+ delobjsmap[scontainer].extend(
+ seg['name'] for seg in part['listing'])
+
if old_slo_manifest_paths:
- delobjsmap = {}
for seg_to_delete in old_slo_manifest_paths:
if seg_to_delete in new_slo_manifest_paths:
continue
@@ -1836,10 +1836,18 @@ class SwiftService(object):
delobjs_cont = delobjsmap.get(scont, [])
delobjs_cont.append(sobj)
delobjsmap[scont] = delobjs_cont
- for (dscont, dsobjs) in delobjsmap.items():
- for dr in self.delete(container=dscont,
- objects=dsobjs):
- drs.append(dr)
+
+ del_segs = []
+ for dscont, dsobjs in delobjsmap.items():
+ for dsobj in dsobjs:
+ del_seg = self.thread_manager.segment_pool.submit(
+ self._delete_segment, dscont, dsobj,
+ results_queue=results_queue
+ )
+ del_segs.append(del_seg)
+
+ for del_seg in interruptable_as_completed(del_segs):
+ drs.append(del_seg.result())
res['segment_delete_results'] = drs
# return dict for printing
diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py
index 98cef85..e4d2b00 100644
--- a/tests/unit/test_shell.py
+++ b/tests/unit/test_shell.py
@@ -491,11 +491,11 @@ class TestShell(unittest.TestCase):
expected_delete_calls = [
mock.call(
b'container1', b'old_seg1',
- query_string=None, response_dict={}
+ response_dict={}
),
mock.call(
b'container2', b'old_seg2',
- query_string=None, response_dict={}
+ response_dict={}
)
]
self.assertEqual(
@@ -540,9 +540,11 @@ class TestShell(unittest.TestCase):
]
connection.return_value.get_container.side_effect = [
[None, [{'name': 'prefix_a', 'bytes': 0,
- 'last_modified': '123T456'},
- {'name': 'prefix_b', 'bytes': 0,
- 'last_modified': '123T456'}]]
+ 'last_modified': '123T456'}]],
+ # Have multiple pages worth of DLO segments
+ [None, [{'name': 'prefix_b', 'bytes': 0,
+ 'last_modified': '123T456'}]],
+ [None, []]
]
connection.return_value.put_object.return_value = (
'd41d8cd98f00b204e9800998ecf8427e')
@@ -557,11 +559,11 @@ class TestShell(unittest.TestCase):
expected_delete_calls = [
mock.call(
'container1', 'prefix_a',
- query_string=None, response_dict={}
+ response_dict={}
),
mock.call(
'container1', 'prefix_b',
- query_string=None, response_dict={}
+ response_dict={}
)
]
self.assertEqual(