diff --git a/ceilometer/storage/impl_sqlalchemy.py b/ceilometer/storage/impl_sqlalchemy.py index b46651c66..281361bfc 100644 --- a/ceilometer/storage/impl_sqlalchemy.py +++ b/ceilometer/storage/impl_sqlalchemy.py @@ -734,6 +734,10 @@ class Connection(base.Connection): res = self._make_stats_query(sample_filter, None, aggregate).first() + if not res: + # NOTE(liusheng):The 'res' may be NoneType, because no + # sample has found with sample filter(s). + return query = self._make_stats_query(sample_filter, groupby, aggregate) # HACK(jd) This is an awful method to compute stats by period, but diff --git a/ceilometer/tests/storage/test_storage_scenarios.py b/ceilometer/tests/storage/test_storage_scenarios.py index cb04fa0ac..4ab139255 100644 --- a/ceilometer/tests/storage/test_storage_scenarios.py +++ b/ceilometer/tests/storage/test_storage_scenarios.py @@ -1364,6 +1364,14 @@ class StatisticsTest(DBTestBase, self.assertEqual(results.sum, 18) self.assertEqual(results.avg, 6) + def test_with_no_sample(self): + f = storage.SampleFilter( + user='user-not-exists', + meter='volume.size', + ) + results = list(self.conn.get_meter_statistics(f, period=1800)) + self.assertEqual([], results) + class StatisticsGroupByTest(DBTestBase, tests_db.MixinTestsWithBackendScenarios):