From de9a51958568bd7f93dcb12edebd30fcea674c51 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Mon, 19 Dec 2016 09:03:16 -0600 Subject: [PATCH] Stop calling HEAD before DELETE for objects It's totally inefficient. Delete throws a 404 if the object isn't there. There's no reason to do a HEAD first. Change-Id: I1e7e0a37d12d15f79786e87dc87afc047495e142 --- shade/openstackcloud.py | 10 ++----- shade/tests/unit/test_object.py | 52 +-------------------------------- 2 files changed, 4 insertions(+), 58 deletions(-) diff --git a/shade/openstackcloud.py b/shade/openstackcloud.py index 312afd0c5..76c23bd0d 100644 --- a/shade/openstackcloud.py +++ b/shade/openstackcloud.py @@ -5734,16 +5734,12 @@ class OpenStackCloud(_normalize.Normalizer): :raises: OpenStackCloudException on operation error. """ - if not self.get_object_metadata(container, name): - return False try: self.manager.submit_task(_tasks.ObjectDelete( container=container, obj=name)) - except swift_exceptions.ClientException as e: - raise OpenStackCloudException( - "Object deletion failed: %s (%s/%s)" % ( - e.http_reason, e.http_host, e.http_path)) - return True + return True + except swift_exceptions.ClientException: + return False def get_object_metadata(self, container, name): try: diff --git a/shade/tests/unit/test_object.py b/shade/tests/unit/test_object.py index 1eea660c9..145e3f1b9 100644 --- a/shade/tests/unit/test_object.py +++ b/shade/tests/unit/test_object.py @@ -384,71 +384,21 @@ class TestObject(base.RequestsMockTestCase): self.cloud.list_objects, self.container) def test_delete_object(self): - # TODO(mordred) calling get_object_metadata first is stupid. We should - # just make the delete call and if it 404's, then the object didn't - # exist. - self.adapter.head( - self.object_endpoint, - headers={ - 'Content-Length': '20304400896', - 'Content-Type': 'application/octet-stream', - 'Accept-Ranges': 'bytes', - 'Last-Modified': 'Thu, 15 Dec 2016 13:34:14 GMT', - 'Etag': '"b5c454b44fbd5344793e3fb7e3850768"', - 'X-Timestamp': '1481808853.65009', - 'X-Trans-Id': 'tx68c2a2278f0c469bb6de1-005857ed80dfw1', - 'Date': 'Mon, 19 Dec 2016 14:24:00 GMT', - 'X-Static-Large-Object': 'True', - 'X-Object-Meta-Mtime': '1481513709.168512', - }) self.adapter.delete(self.object_endpoint, status_code=204) self.assertTrue(self.cloud.delete_object(self.container, self.object)) self.calls += [ - dict(method='HEAD', url=self.object_endpoint), dict(method='DELETE', url=self.object_endpoint), ] self.assert_calls() def test_delete_object_not_found(self): - self.adapter.head(self.object_endpoint, status_code=404) + self.adapter.delete(self.object_endpoint, status_code=404) self.assertFalse(self.cloud.delete_object(self.container, self.object)) self.calls += [ - dict(method='HEAD', url=self.object_endpoint), - ] - self.assert_calls() - - def test_delete_object_exception(self): - self.adapter.head( - self.object_endpoint, - headers={ - 'Content-Length': '20304400896', - 'Content-Type': 'application/octet-stream', - 'Accept-Ranges': 'bytes', - 'Last-Modified': 'Thu, 15 Dec 2016 13:34:14 GMT', - 'Etag': '"b5c454b44fbd5344793e3fb7e3850768"', - 'X-Timestamp': '1481808853.65009', - 'X-Trans-Id': 'tx68c2a2278f0c469bb6de1-005857ed80dfw1', - 'Date': 'Mon, 19 Dec 2016 14:24:00 GMT', - 'X-Static-Large-Object': 'True', - 'X-Object-Meta-Mtime': '1481513709.168512', - }) - - # TODO(mordred) This version of the code is prone to race conditions - # When we stop doing HEAD first, we can kill this test. - self.adapter.delete(self.object_endpoint, status_code=404) - - self.assertRaises( - shade.OpenStackCloudException, - self.cloud.delete_object, - self.container, - self.object) - - self.calls += [ - dict(method='HEAD', url=self.object_endpoint), dict(method='DELETE', url=self.object_endpoint), ] self.assert_calls()