summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-09-29 01:54:55 +0000
committerGerrit Code Review <review@openstack.org>2012-09-29 01:54:55 +0000
commit7104362abbee82b3d2adebdf5589f859c1b67279 (patch)
treebbddbe6284d35641f139b21fda59eddca1f178a4 /nova/compute
parent8e9a2ac7fe19ca8319b27b4cf779b255926033a0 (diff)
parent8887f10c66bca248f289db8f834ae8f36f9a03a1 (diff)
Merge "Collect more accurate bandwidth data for XenServer"
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/manager.py56
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