summaryrefslogtreecommitdiffstats
path: root/keystone/common/sql/core.py
diff options
context:
space:
mode:
authorRoman Verchikov <rverchikov@mirantis.com>2013-08-07 14:56:24 -0700
committerRoman Verchikov <rverchikov@mirantis.com>2013-08-07 14:56:24 -0700
commitb920d15b01b21831999030b0becbc1da988ee638 (patch)
tree2bab843091f7993eeab1881aa3de051d01f9ebb4 /keystone/common/sql/core.py
parented1f9676d9e59022ecd9cd05e50b970d1b2930c8 (diff)
downloadkeystone-b920d15b01b21831999030b0becbc1da988ee638.tar.gz
keystone-b920d15b01b21831999030b0becbc1da988ee638.tar.xz
keystone-b920d15b01b21831999030b0becbc1da988ee638.zip
Fix select n+1 issue in keystone catalog
keystone.catalog.backends.sql.get_catalog() and get_v3_catalog() methods generate N+1 select statements for each endpoint. Use sqlalchemy's eager load to generate single select statement instead of generating N+1 select statents for each endpoint. Given change does not modify DB schema and is runtime-only, since it's a one-to-many relationship. Change-Id: Ia72b8603fc13f01696771f6116b320364bd50f51 Fixes: bug #1206725
Diffstat (limited to 'keystone/common/sql/core.py')
-rw-r--r--keystone/common/sql/core.py4
1 files changed, 4 insertions, 0 deletions
diff --git a/keystone/common/sql/core.py b/keystone/common/sql/core.py
index 2d3114f2..a2deb58b 100644
--- a/keystone/common/sql/core.py
+++ b/keystone/common/sql/core.py
@@ -54,6 +54,8 @@ NotFound = sql.orm.exc.NoResultFound
Boolean = sql.Boolean
Text = sql.Text
UniqueConstraint = sql.UniqueConstraint
+relationship = sql.orm.relationship
+joinedload = sql.orm.joinedload
def initialize_decorator(init):
@@ -179,6 +181,8 @@ class DictBase(object):
setattr(self, key, value)
def __getitem__(self, key):
+ if key in self.extra:
+ return self.extra[key]
return getattr(self, key)
def get(self, key, default=None):