From 19bbb7bbf46b52ac993eb408c36be1847309fd79 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Fri, 8 Apr 2016 14:20:52 -0500 Subject: [PATCH] Set min_segment_size from the swift capabilities Older swifts have a minimum limit on how small a segment can be in an Large Object. This is no longer needed in current OpenStack, but is important in old OpenStack. Change-Id: Iff83506d276b236c2ce3b078b3fbd9533c912b07 --- shade/openstackcloud.py | 4 ++++ shade/tests/unit/test_object.py | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/shade/openstackcloud.py b/shade/openstackcloud.py index 0a4433191..da27b8ce3 100644 --- a/shade/openstackcloud.py +++ b/shade/openstackcloud.py @@ -3977,6 +3977,7 @@ class OpenStackCloud(object): '''get a segment size that will work given capabilities''' if segment_size is None: segment_size = DEFAULT_OBJECT_SEGMENT_SIZE + min_segment_size = 0 try: caps = self.get_object_capabilities() except swift_exceptions.ClientException as e: @@ -3991,9 +3992,12 @@ class OpenStackCloud(object): else: server_max_file_size = caps.get('swift', {}).get('max_file_size', 0) + min_segment_size = caps.get('slo', {}).get('min_segment_size', 0) if segment_size > server_max_file_size: return server_max_file_size + if segment_size < min_segment_size: + return min_segment_size return segment_size def is_object_stale( diff --git a/shade/tests/unit/test_object.py b/shade/tests/unit/test_object.py index 84c543c93..d5f7b22bb 100644 --- a/shade/tests/unit/test_object.py +++ b/shade/tests/unit/test_object.py @@ -64,8 +64,10 @@ class TestObject(base.TestCase): @mock.patch.object(shade.OpenStackCloud, 'swift_client') def test_get_object_segment_size(self, swift_mock): - swift_mock.get_capabilities.return_value = {'swift': - {'max_file_size': 1000}} + swift_mock.get_capabilities.return_value = { + 'swift': {'max_file_size': 1000}, + 'slo': {'min_segment_size': 500}} + self.assertEqual(500, self.cloud.get_object_segment_size(400)) self.assertEqual(900, self.cloud.get_object_segment_size(900)) self.assertEqual(1000, self.cloud.get_object_segment_size(1000)) self.assertEqual(1000, self.cloud.get_object_segment_size(1100))