Merge "Fix sqlalchemy performance problem"
This commit is contained in:
commit
924eea2e9b
@ -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
|
||||
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user