From 6140285b59793d68947b8a3d23ede81dcc914062 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Thu, 21 Aug 2025 18:19:49 +0200 Subject: [PATCH] Reduce the number of RPC calls to traits API First, create_node already returns a complete TraitsList object as node.traits, there is no need to fetch it again over RPC. Second, there is no need to make get_trait_names an RPC call since it operates on the local TraitsList object and does not access the DB. Change-Id: Ic5563e5d1c36e7a4a8aa4aeeca4bf66255d55e7a Signed-off-by: Dmitry Tantsur --- ironic/api/controllers/v1/node.py | 7 +++++-- ironic/common/release_mappings.py | 2 +- ironic/objects/trait.py | 6 +++--- ironic/tests/unit/objects/test_objects.py | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index b90d119b52..98028a5477 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -1651,8 +1651,11 @@ def node_convert_with_links(rpc_node, fields=None, sanitize=True): fields=_get_fields_for_node_query(fields)) if node.get('traits') is not None: - traits = objects.TraitList.get_by_node_id(api.request.context, - rpc_node.id) + if isinstance(node['traits'], objects.TraitList): + traits = node['traits'] + else: + traits = objects.TraitList.get_by_node_id(api.request.context, + rpc_node.id) node['traits'] = traits.get_trait_names() if (api_utils.allow_expose_conductors() diff --git a/ironic/common/release_mappings.py b/ironic/common/release_mappings.py index 36a0bdb621..9dcf30c211 100644 --- a/ironic/common/release_mappings.py +++ b/ironic/common/release_mappings.py @@ -911,7 +911,7 @@ RELEASE_MAPPING = { 'Port': ['1.14', '1.13', '1.12'], 'Portgroup': ['1.6', '1.5'], 'Trait': ['1.1', '1.0'], - 'TraitList': ['1.1', '1.0'], + 'TraitList': ['1.2', '1.1', '1.0'], 'VolumeConnector': ['1.1', '1.0'], 'VolumeTarget': ['1.1', '1.0'], 'FirmwareComponent': ['1.1', '1.0'], diff --git a/ironic/objects/trait.py b/ironic/objects/trait.py index 0575628f73..51874cc0d5 100644 --- a/ironic/objects/trait.py +++ b/ironic/objects/trait.py @@ -88,7 +88,8 @@ class Trait(base.IronicObject): class TraitList(base.IronicObjectListBase, base.IronicObject): # Version 1.0: Initial version # Version 1.1: Relevant methods changed to be remotable methods. - VERSION = '1.1' + # Version 1.2: Revert get_trait_names to a normal method. + VERSION = '1.2' dbapi = db_api.get_instance() @@ -147,7 +148,6 @@ class TraitList(base.IronicObjectListBase, base.IronicObject): """ cls.dbapi.unset_node_traits(node_id) - @object_base.remotable - def get_trait_names(self, context=None): + def get_trait_names(self): """Return a list of names of the traits in this list.""" return [t.trait for t in self.objects] diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py index 3deb6ec329..7c87eb7217 100644 --- a/ironic/tests/unit/objects/test_objects.py +++ b/ironic/tests/unit/objects/test_objects.py @@ -709,7 +709,7 @@ expected_object_fingerprints = { 'VolumeTargetCRUDNotification': '1.0-59acc533c11d306f149846f922739c15', 'VolumeTargetCRUDPayload': '1.0-30dcc4735512c104a3a36a2ae1e2aeb2', 'Trait': '1.1-ae534208fc5ade27700db7202b5b6b82', - 'TraitList': '1.1-1e938b9a94cba59f5ac35a5db0a6dc0f', + 'TraitList': '1.2-120fedaa212ddbcf9f6148a64c550946', 'BIOSSetting': '1.2-a0c2924d8ffef7ed872e48435a569a83', 'BIOSSettingList': '1.1-6e606655643a9a5fa116ce771cbebe59', 'Allocation': '1.3-91102bce67725a4ee924c6b2f213bcde',