From 45202b1e044f52aa863ed135564cc1fc74b43145 Mon Sep 17 00:00:00 2001 From: Abhishek Kekane Date: Tue, 12 Nov 2024 05:49:23 +0000 Subject: [PATCH] Fix performance glitch while sorting image locations Some of the available glance stores like file, cinder etc has capability to reuse already initiated driver (DRIVER_REUSABLE = 0b01000000). In Caracal we have added a feature to sort image locations based on store weight. As RBD driver of glance does not have this reuse capability, during image list API call it initializes the RBD driver for each of the available image which is causing noticable delay in list call. To avoid this, using new interface added in glance_store which will directly get the weight of the store from memory and return it back to user. Depends-On: https://review.opendev.org/c/openstack/glance_store/+/934362 Closes-Bug: #2086675 Change-Id: I662ba19697e03917ca999920ea7be93a0b2a8296 --- glance/common/utils.py | 3 +-- glance/tests/unit/common/test_utils.py | 16 +++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/glance/common/utils.py b/glance/common/utils.py index 1f9eacedf2..93bb166fbe 100644 --- a/glance/common/utils.py +++ b/glance/common/utils.py @@ -723,13 +723,12 @@ def sort_image_locations(locations): if not store_id: return 0 try: - store = glance_store.get_store_from_store_identifier(store_id) + return glance_store.get_store_weight(store_id) except glance_store.exceptions.UnknownScheme: msg = (_LW("Unable to find store '%s', returning " "default weight '0'") % store_id) LOG.warning(msg) return 0 - return store.weight if store is not None else 0 sorted_locations = sorted(locations, key=get_store_weight, reverse=True) LOG.debug(('Sorted locations: %s'), sorted_locations) diff --git a/glance/tests/unit/common/test_utils.py b/glance/tests/unit/common/test_utils.py index ae676171bf..339e98b508 100644 --- a/glance/tests/unit/common/test_utils.py +++ b/glance/tests/unit/common/test_utils.py @@ -192,7 +192,7 @@ class TestUtils(test_utils.BaseTestCase): 'url': 'rbd://cccccccc/images/id', 'metadata': {'store': 'rbd3'} }] - mp = "glance.common.utils.glance_store.get_store_from_store_identifier" + mp = "glance.common.utils.glance_store.get_store_weight" with mock.patch(mp) as mock_get_store: utils.sort_image_locations(locations) @@ -218,10 +218,9 @@ class TestUtils(test_utils.BaseTestCase): 'url': 'rbd://cccccccc/images/id', 'metadata': {'store': 'rbd3'} }] - mp = "glance.common.utils.glance_store.get_store_from_store_identifier" + mp = "glance.common.utils.glance_store.get_store_weight" with mock.patch(mp) as mock_get_store: - mock_store = mock_get_store.return_value - mock_store.weight = 100 + mock_get_store.return_value = 100 utils.sort_image_locations(locations) # Since 3 stores are configured, internal method will be called 3 times @@ -246,7 +245,7 @@ class TestUtils(test_utils.BaseTestCase): 'url': 'rbd://cccccccc/images/id', 'metadata': {} }] - mp = "glance.common.utils.glance_store.get_store_from_store_identifier" + mp = "glance.common.utils.glance_store.get_store_weight" with mock.patch(mp) as mock_get_store: utils.sort_image_locations(locations) @@ -273,10 +272,9 @@ class TestUtils(test_utils.BaseTestCase): 'url': 'rbd://cccccccc/images/id', 'metadata': {} }] - mp = "glance.common.utils.glance_store.get_store_from_store_identifier" + mp = "glance.common.utils.glance_store.get_store_weight" with mock.patch(mp) as mock_get_store: - mock_store = mock_get_store.return_value - mock_store.weight = 100 + mock_get_store.return_value = 100 utils.sort_image_locations(locations) # Since 3 stores are configured, but only one location has @@ -303,7 +301,7 @@ class TestUtils(test_utils.BaseTestCase): 'url': 'rbd://cccccccc/images/id', 'metadata': {'store': 'rbd3'} }] - mp = "glance.common.utils.glance_store.get_store_from_store_identifier" + mp = "glance.common.utils.glance_store.get_store_weight" with mock.patch(mp) as mock_get_store: mock_get_store.side_effect = store.UnknownScheme() sorted_locations = utils.sort_image_locations(locations)