From 4aee80dd31131675ae0ab9f927b2d4aed0b8426a Mon Sep 17 00:00:00 2001 From: Michael Kerrin Date: Thu, 6 Jun 2013 08:52:52 +0000 Subject: Sending volume IO usage broken This is my fault, I didn't test the sending of notifications enough when fixing bug 1182102, when the volume IO usage notifications were been sent too often. This was merged as part of https://review.openstack.org/#/c/29915 The issue was that the code worked for the first IO usage event (the one I looked at). Then when constructing the event payload for the second and following IO usage events the code path ended up comparing a datetime object from the db with a cached string representation of the last_refreshed date that was passed into the conductor via the RPC. Since last_refreshed argument to vol_usage_update in the db layer is not needed and is causing these issues. I have removed last_refreshed argument from the db layer and deprecated it from the conduction API. Change-Id: I2030eb7912c56134ea688a6e8bbfcdeddca28307 --- nova/compute/manager.py | 8 +++----- nova/compute/utils.py | 9 +++++++-- 2 files changed, 10 insertions(+), 7 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 2390eb3c3..8434a64ca 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -3782,7 +3782,7 @@ class ComputeManager(manager.SchedulerDependentManager): return compute_host_bdms - def _update_volume_usage_cache(self, context, vol_usages, refreshed): + def _update_volume_usage_cache(self, context, vol_usages): """Updates the volume usage cache table with a list of stats.""" for usage in vol_usages: # Allow switching of greenthreads between queries. @@ -3792,8 +3792,7 @@ class ComputeManager(manager.SchedulerDependentManager): usage['rd_bytes'], usage['wr_req'], usage['wr_bytes'], - usage['instance'], - last_refreshed=refreshed) + usage['instance']) @periodic_task.periodic_task def _poll_volume_usage(self, context, start_time=None): @@ -3820,8 +3819,7 @@ class ComputeManager(manager.SchedulerDependentManager): except NotImplementedError: return - refreshed = timeutils.utcnow() - self._update_volume_usage_cache(context, vol_usages, refreshed) + self._update_volume_usage_cache(context, vol_usages) @periodic_task.periodic_task def _report_driver_status(self, context): diff --git a/nova/compute/utils.py b/nova/compute/utils.py index 1ce115b20..621f558cb 100644 --- a/nova/compute/utils.py +++ b/nova/compute/utils.py @@ -290,8 +290,13 @@ def usage_volume_info(vol_usage): tot_refreshed = vol_usage['tot_last_refreshed'] curr_refreshed = vol_usage['curr_last_refreshed'] - last_refreshed_time = (tot_refreshed if tot_refreshed > curr_refreshed - else curr_refreshed) + if tot_refreshed and curr_refreshed: + last_refreshed_time = max(tot_refreshed, curr_refreshed) + elif tot_refreshed: + last_refreshed_time = tot_refreshed + else: + # curr_refreshed must be set + last_refreshed_time = curr_refreshed usage_info = dict( volume_id=vol_usage['volume_id'], -- cgit