From 48621685389a491d0519faf8fe52dc682e020c67 Mon Sep 17 00:00:00 2001 From: Boris Pavlovic Date: Fri, 19 Apr 2013 09:41:07 +0400 Subject: Performance optimization for contrib.flavorextraspecs In method FlavorExtraSpecsController.index(): This method calls FlavorExtraSpecsController._get_extra_specs() that returns all extra_specs that has flavor. In db.api layer we are returning already extra_specs as plain object, so there is no reason to make one more time copy of extra_specs. In method FlavorExtraSpecsController.show(): This method should return extra_spec that corresponds to specified key and flavor_id. Was: Get all extra_specs by flavor_id and filter by key locally Now: Filter by flavor_id and key in db. Change-Id: I4c39f5f56511e67e37482cda1b4e9771ee9c7d7d --- nova/db/api.py | 5 +++++ nova/db/sqlalchemy/api.py | 12 ++++++++++++ 2 files changed, 17 insertions(+) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index f454a2d15..81350ec20 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1313,6 +1313,11 @@ def instance_type_extra_specs_get(context, flavor_id): return IMPL.instance_type_extra_specs_get(context, flavor_id) +def instance_type_extra_specs_get_item(context, flavor_id, key): + """Get extra specs by key and flavor_id.""" + return IMPL.instance_type_extra_specs_get_item(context, flavor_id, key) + + def instance_type_extra_specs_delete(context, flavor_id, key): """Delete the given extra specs item.""" IMPL.instance_type_extra_specs_delete(context, flavor_id, key) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 55be0da2d..a269dd263 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -3874,6 +3874,18 @@ def instance_type_extra_specs_get(context, flavor_id): return dict([(row['key'], row['value']) for row in rows]) +@require_context +def instance_type_extra_specs_get_item(context, flavor_id, key): + result = _instance_type_extra_specs_get_query(context, flavor_id).\ + filter(models.InstanceTypeExtraSpecs.key == key).\ + first() + if not result: + raise exception.InstanceTypeExtraSpecsNotFound( + extra_specs_key=key, instance_type_id=flavor_id) + + return {result["key"]: result["value"]} + + @require_context def instance_type_extra_specs_delete(context, flavor_id, key): _instance_type_extra_specs_get_query(context, flavor_id).\ -- cgit