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
This commit is contained in:
Abhishek Kekane 2024-11-12 05:49:23 +00:00
parent cfa36c1b55
commit 45202b1e04
2 changed files with 8 additions and 11 deletions

View File

@ -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)

View File

@ -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)