Merge "Fix sqlalchemy performance problem"

This commit is contained in:
Jenkins 2012-10-30 14:21:47 +00:00 committed by Gerrit Code Review
commit 924eea2e9b
3 changed files with 15 additions and 23 deletions

View File

@ -24,8 +24,7 @@ from ceilometer.openstack.common import cfg
from ceilometer.storage import base
from ceilometer.storage.sqlalchemy.models import Meter, Project, Resource
from ceilometer.storage.sqlalchemy.models import Source, User
from ceilometer.storage.sqlalchemy.session import get_session
import ceilometer.storage.sqlalchemy.session as session
import ceilometer.storage.sqlalchemy.session as sqlalchemy_session
LOG = log.getLogger(__name__)
@ -109,7 +108,7 @@ class Connection(base.Connection):
def _get_connection(self, conf):
"""Return a connection to the database.
"""
return session.get_session()
return sqlalchemy_session.get_session()
def record_metering_data(self, data):
"""Write the data to the backend storage system.
@ -222,6 +221,8 @@ class Connection(base.Connection):
query = query.filter(Resource.timestamp < end_timestamp)
if project is not None:
query = query.filter(Resource.project_id == project)
query = query.options(
sqlalchemy_session.sqlalchemy.orm.joinedload('meters'))
for resource in query.all():
r = row2dict(resource)
@ -262,7 +263,7 @@ class Connection(base.Connection):
( datetime.datetime(), datetime.datetime() )
"""
func = session.func()
func = sqlalchemy_session.sqlalchemy.func
query = self.session.query(func.min(Meter.timestamp),
func.max(Meter.timestamp))
query = make_query_from_filter(query, event_filter)
@ -279,7 +280,7 @@ def model_query(*args, **kwargs):
:param session: if present, the session to use
"""
session = kwargs.get('session') or get_session()
session = kwargs.get('session') or sqlalchemy_session.get_session()
query = session.query(*args)
return query

View File

@ -96,8 +96,7 @@ class Meter(Base):
__tablename__ = 'meter'
id = Column(Integer, primary_key=True)
counter_name = Column(String(255))
sources = relationship("Source", secondary=lambda: sourceassoc,
lazy='joined')
sources = relationship("Source", secondary=lambda: sourceassoc)
user_id = Column(String(255), ForeignKey('user.id'))
project_id = Column(String(255), ForeignKey('project.id'))
resource_id = Column(String(255), ForeignKey('resource.id'))
@ -112,29 +111,26 @@ class Meter(Base):
class User(Base):
__tablename__ = 'user'
id = Column(String(255), primary_key=True)
sources = relationship("Source", secondary=lambda: sourceassoc,
lazy='joined')
resources = relationship("Resource", backref='user', lazy='joined')
meters = relationship("Meter", backref='user', lazy='joined')
sources = relationship("Source", secondary=lambda: sourceassoc)
resources = relationship("Resource", backref='user')
meters = relationship("Meter", backref='user')
class Project(Base):
__tablename__ = 'project'
id = Column(String(255), primary_key=True)
sources = relationship("Source", secondary=lambda: sourceassoc,
lazy='joined')
resources = relationship("Resource", backref='project', lazy='joined')
meters = relationship("Meter", backref='project', lazy='joined')
sources = relationship("Source", secondary=lambda: sourceassoc)
resources = relationship("Resource", backref='project')
meters = relationship("Meter", backref='project')
class Resource(Base):
__tablename__ = 'resource'
id = Column(String(255), primary_key=True)
sources = relationship("Source", secondary=lambda: sourceassoc,
lazy='joined')
sources = relationship("Source", secondary=lambda: sourceassoc)
timestamp = Column(DateTime)
resource_metadata = Column(JSONEncodedDict)
received_timestamp = Column(DateTime, default=timeutils.utcnow)
user_id = Column(String(255), ForeignKey('user.id'))
project_id = Column(String(255), ForeignKey('project.id'))
meters = relationship("Meter", backref='resource', lazy='joined')
meters = relationship("Meter", backref='resource')

View File

@ -189,8 +189,3 @@ def get_maker(engine, autocommit=True, expire_on_commit=False, autoflush=True):
autocommit=autocommit,
autoflush=autoflush,
expire_on_commit=expire_on_commit)
def func():
# ugly hack sqlalchemy name conflict from impl_sqlalchemy
return sqlalchemy.func