From 26e03a5173b62c66f114bb03b90eb1831ec0810d Mon Sep 17 00:00:00 2001 From: Chris Behrens Date: Mon, 13 Aug 2012 07:33:15 +0000 Subject: [PATCH] Improve bw_usage_update() performance Fixes bug 1036084 bw_usage_update() most commonly updates rows vs creates rows. New rows are only created on the 1st bandwidth update for an instance or when the audit period rolls over. This cuts down DB queries to 1 for the 'update' case. Added bonus: Remove unused 'import inspect' in compute manager. Change-Id: Ie5f6c919676046d817b842138dc9d17d1115d3c0 --- nova/tests/test_db_api.py | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 9acc964c..93e0edfb 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -459,6 +459,65 @@ class DbApiTestCase(test.TestCase): ec2_id = db.get_ec2_snapshot_id_by_uuid(self.context, 'fake-uuid') self.assertEqual(ref['id'], ec2_id) + def test_bw_usage_calls(self): + ctxt = context.get_admin_context() + now = timeutils.utcnow() + timeutils.set_time_override(now) + start_period = now - datetime.timedelta(seconds=10) + uuid3_refreshed = now - datetime.timedelta(seconds=5) + + expected_bw_usages = [{'uuid': 'fake_uuid1', + 'mac': 'fake_mac1', + 'start_period': start_period, + 'bw_in': 100, + 'bw_out': 200, + 'last_refreshed': now}, + {'uuid': 'fake_uuid2', + 'mac': 'fake_mac2', + 'start_period': start_period, + 'bw_in': 200, + 'bw_out': 300, + 'last_refreshed': now}, + {'uuid': 'fake_uuid3', + 'mac': 'fake_mac3', + 'start_period': start_period, + 'bw_in': 400, + 'bw_out': 500, + 'last_refreshed': uuid3_refreshed}] + + def _compare(bw_usage, expected): + for key, value in expected.items(): + self.assertEqual(bw_usage[key], value) + + bw_usages = db.bw_usage_get_by_uuids(ctxt, + ['fake_uuid1', 'fake_uuid2'], start_period) + # No matches + self.assertEqual(len(bw_usages), 0) + + # Add 3 entries + db.bw_usage_update(ctxt, 'fake_uuid1', + 'fake_mac1', start_period, + 100, 200) + db.bw_usage_update(ctxt, 'fake_uuid2', + 'fake_mac2', start_period, + 100, 200) + # Test explicit refreshed time + db.bw_usage_update(ctxt, 'fake_uuid3', + 'fake_mac3', start_period, + 400, 500, last_refreshed=uuid3_refreshed) + # Update 2nd entry + db.bw_usage_update(ctxt, 'fake_uuid2', + 'fake_mac2', start_period, + 200, 300) + + bw_usages = db.bw_usage_get_by_uuids(ctxt, + ['fake_uuid1', 'fake_uuid2', 'fake_uuid3'], start_period) + self.assertEqual(len(bw_usages), 3) + _compare(bw_usages[0], expected_bw_usages[0]) + _compare(bw_usages[1], expected_bw_usages[1]) + _compare(bw_usages[2], expected_bw_usages[2]) + timeutils.clear_time_override() + def _get_fake_aggr_values(): return {'name': 'fake_aggregate',