diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-09-29 01:54:55 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-09-29 01:54:55 +0000 |
| commit | 7104362abbee82b3d2adebdf5589f859c1b67279 (patch) | |
| tree | bbddbe6284d35641f139b21fda59eddca1f178a4 /nova/compute | |
| parent | 8e9a2ac7fe19ca8319b27b4cf779b255926033a0 (diff) | |
| parent | 8887f10c66bca248f289db8f834ae8f36f9a03a1 (diff) | |
Merge "Collect more accurate bandwidth data for XenServer"
Diffstat (limited to 'nova/compute')
| -rw-r--r-- | nova/compute/manager.py | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 13c4b21c2..f9c739001 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -2529,9 +2529,8 @@ class ComputeManager(manager.SchedulerDependentManager): time.time() - start_time)) @manager.periodic_task - def _poll_bandwidth_usage(self, context, start_time=None, stop_time=None): - if not start_time: - start_time = utils.last_completed_audit_period()[1] + def _poll_bandwidth_usage(self, context): + prev_time, start_time = utils.last_completed_audit_period() curr_time = time.time() if (curr_time - self._last_bw_usage_poll > @@ -2541,8 +2540,7 @@ class ComputeManager(manager.SchedulerDependentManager): instances = self.db.instance_get_all_by_host(context, self.host) try: - bw_usage = self.driver.get_all_bw_usage(instances, start_time, - stop_time) + bw_counters = self.driver.get_all_bw_counters(instances) except NotImplementedError: # NOTE(mdragon): Not all hypervisors have bandwidth polling # implemented yet. If they don't it doesn't break anything, @@ -2550,12 +2548,52 @@ class ComputeManager(manager.SchedulerDependentManager): return refreshed = timeutils.utcnow() - for usage in bw_usage: + for bw_ctr in bw_counters: + # Allow switching of greenthreads between queries. + greenthread.sleep(0) + bw_in = 0 + bw_out = 0 + last_ctr_in = None + last_ctr_out = None + usage = self.db.bw_usage_get(context, + bw_ctr['uuid'], + start_time, + bw_ctr['mac_address']) + if usage: + bw_in = usage['bw_in'] + bw_out = usage['bw_out'] + last_ctr_in = usage['last_ctr_in'] + last_ctr_out = usage['last_ctr_out'] + else: + usage = self.db.bw_usage_get(context, + bw_ctr['uuid'], + prev_time, + bw_ctr['mac_address']) + last_ctr_in = usage['last_ctr_in'] + last_ctr_out = usage['last_ctr_out'] + + if last_ctr_in is not None: + if bw_ctr['bw_in'] < last_ctr_in: + # counter rollover + bw_in += bw_ctr['bw_in'] + else: + bw_in += (bw_ctr['bw_in'] - last_ctr_in) + + if last_ctr_out is not None: + if bw_ctr['bw_out'] < last_ctr_out: + # counter rollover + bw_out += bw_ctr['bw_out'] + else: + bw_out += (bw_ctr['bw_out'] - last_ctr_out) + self.db.bw_usage_update(context, - usage['uuid'], - usage['mac_address'], + bw_ctr['uuid'], + bw_ctr['mac_address'], start_time, - usage['bw_in'], usage['bw_out'], + bw_in, + bw_out, + bw_ctr['bw_in'], + bw_ctr['bw_out'], last_refreshed=refreshed) @manager.periodic_task |
