Merge "metering data ttl sql backend breaks resource metadata"

This commit is contained in:
Jenkins 2015-02-10 09:19:57 +00:00 committed by Gerrit Code Review
commit df914ed869
2 changed files with 23 additions and 16 deletions

View File

@ -357,23 +357,25 @@ class Connection(base.Connection):
end = timeutils.utcnow() - datetime.timedelta(seconds=ttl)
sample_q = (session.query(models.Sample)
.filter(models.Sample.timestamp < end))
sample_subq = sample_q.subquery()
for table in [models.MetaText, models.MetaBigInt,
models.MetaFloat, models.MetaBool]:
(session.query(table)
.join(sample_subq, sample_subq.c.id == table.id)
.delete())
rows = sample_q.delete()
LOG.info(_("%d samples removed from database"), rows)
# remove Meter definitions with no matching samples
(session.query(models.Meter)
.filter(~models.Meter.samples.any())
.delete(synchronize_session='fetch'))
(session.query(models.Resource)
.filter(~models.Resource.samples.any())
.delete(synchronize_session='fetch'))
LOG.info(_("%d samples removed from database"), rows)
.delete(synchronize_session=False))
# remove resources with no matching samples
resource_q = (session.query(models.Resource.internal_id)
.filter(~models.Resource.samples.any()))
resource_subq = resource_q.subquery()
# remove metadata of cleaned resources
for table in [models.MetaText, models.MetaBigInt,
models.MetaFloat, models.MetaBool]:
(session.query(table)
.filter(table.id.in_(resource_subq))
.delete(synchronize_session=False))
resource_q.delete(synchronize_session=False)
def get_resources(self, user=None, project=None, source=None,
start_timestamp=None, start_timestamp_op=None,

View File

@ -180,14 +180,19 @@ class RelationshipTest(scenarios.DBTestBase):
self.conn.clear_expired_metering_data(3 * 60)
session = self.conn._engine_facade.get_session()
self.assertEqual(5, session.query(sql_models.Sample).count())
resource_ids = (session.query(sql_models.Resource.internal_id)
.group_by(sql_models.Resource.internal_id))
meta_tables = [sql_models.MetaText, sql_models.MetaFloat,
sql_models.MetaBigInt, sql_models.MetaBool]
s = set()
for table in meta_tables:
self.assertEqual(0, (session.query(table)
.filter(~table.id.in_(
session.query(sql_models.Sample.id)
.group_by(sql_models.Sample.id))).count()
.filter(~table.id.in_(resource_ids)).count()
))
s.update(session.query(table.id).all())
self.assertEqual(set(resource_ids.all()), s)
class CapabilitiesTest(test_base.BaseTestCase):