From 9751562cd0966b5d911a6c147ae23b0577aa0fa3 Mon Sep 17 00:00:00 2001 From: Eugene Nikanorov Date: Mon, 6 May 2013 15:28:09 +0400 Subject: [PATCH] Avoid extra queries when retrieving routers fixes bug 1160333 Instead of making N additional sql requests, use relationship and joined query. Change-Id: I8f650691916a252bf2a525343bfa0521ff6fbe43 --- quantum/db/extraroute_db.py | 26 ++++++++++++++++++++------ quantum/db/l3_db.py | 6 +++++- quantum/extensions/l3.py | 3 ++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/quantum/db/extraroute_db.py b/quantum/db/extraroute_db.py index e11c16571..b8dfcd878 100644 --- a/quantum/db/extraroute_db.py +++ b/quantum/db/extraroute_db.py @@ -18,12 +18,15 @@ import netaddr from oslo.config import cfg import sqlalchemy as sa +from sqlalchemy import orm from quantum.common import utils +from quantum.db import db_base_plugin_v2 from quantum.db import l3_db from quantum.db import model_base from quantum.db import models_v2 from quantum.extensions import extraroute +from quantum.extensions import l3 from quantum.openstack.common import log as logging @@ -44,9 +47,24 @@ class RouterRoute(model_base.BASEV2, models_v2.Route): ondelete="CASCADE"), primary_key=True) + router = orm.relationship(l3_db.Router, + backref=orm.backref("route_list", + lazy='joined', + cascade='delete')) + class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin): """Mixin class to support extra route configuration on router.""" + + def _extend_router_dict_extraroute(self, router_res, router_db): + router_res['routes'] = (ExtraRoute_db_mixin. + _make_extra_route_list( + router_db['route_list'] + )) + + db_base_plugin_v2.QuantumDbPluginV2.register_dict_extend_funcs( + l3.ROUTERS, [_extend_router_dict_extraroute]) + def update_router(self, context, id, router): r = router['router'] with context.session.begin(subtransactions=True): @@ -123,7 +141,8 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin): destination=route['destination'], nexthop=route['nexthop']).delete() - def _make_extra_route_list(self, extra_routes): + @staticmethod + def _make_extra_route_list(extra_routes): return [{'destination': route['destination'], 'nexthop': route['nexthop']} for route in extra_routes] @@ -137,8 +156,6 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin): with context.session.begin(subtransactions=True): router = super(ExtraRoute_db_mixin, self).get_router( context, id, fields) - router['routes'] = self._get_extra_routes_by_router_id( - context, id) return router def get_routers(self, context, filters=None, fields=None, @@ -148,9 +165,6 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin): routers = super(ExtraRoute_db_mixin, self).get_routers( context, filters, fields, sorts=sorts, limit=limit, marker=marker, page_reverse=page_reverse) - for router in routers: - router['routes'] = self._get_extra_routes_by_router_id( - context, router['id']) return routers def _confirm_router_interface_not_in_use(self, context, router_id, diff --git a/quantum/db/l3_db.py b/quantum/db/l3_db.py index 09703f765..278037e47 100644 --- a/quantum/db/l3_db.py +++ b/quantum/db/l3_db.py @@ -127,7 +127,8 @@ class L3_NAT_db_mixin(l3.RouterPluginBase): raise l3.RouterNotFound(router_id=id) return router - def _make_router_dict(self, router, fields=None): + def _make_router_dict(self, router, fields=None, + process_extensions=True): res = {'id': router['id'], 'name': router['name'], 'tenant_id': router['tenant_id'], @@ -138,6 +139,9 @@ class L3_NAT_db_mixin(l3.RouterPluginBase): if router['gw_port_id']: nw_id = router.gw_port['network_id'] res['external_gateway_info'] = {'network_id': nw_id} + if process_extensions: + for func in self._dict_extend_functions.get(l3.ROUTERS, []): + func(self, res, router) return self._fields(res, fields) def create_router(self, context, router): diff --git a/quantum/extensions/l3.py b/quantum/extensions/l3.py index d91cde103..99691b1bf 100644 --- a/quantum/extensions/l3.py +++ b/quantum/extensions/l3.py @@ -87,10 +87,11 @@ class RouterExternalGatewayInUseByFloatingIp(qexception.InUse): "gateway to external network %(net_id)s is required by one or " "more floating IPs.") +ROUTERS = 'routers' # Attribute Map RESOURCE_ATTRIBUTE_MAP = { - 'routers': { + ROUTERS: { 'id': {'allow_post': False, 'allow_put': False, 'validate': {'type:uuid': None}, 'is_visible': True, -- 2.45.2