Don't update XML when polling disk and net stats.

We need to parse the XML doc when polling for disk and net stats. However,
it isn't that important for us to have up2date xml when doing so: having a
disk or net device added behind our back is likely a rare occurence, and
the xml will be updated via other means quite often.

So, don't update the xml.
This commit is contained in:
Cole Robinson 2009-07-11 21:23:07 -04:00
parent b4b5a2b138
commit 2da5651b8c

View File

@ -88,10 +88,17 @@ class vmmDomain(gobject.GObject):
self.connection.set_dom_flags(vm) self.connection.set_dom_flags(vm)
def get_xml(self): def get_xml(self):
# Get domain xml. If cached xml is invalid, update. """
if self._xml is None or not self._valid_xml: Get domain xml. If cached xml is invalid, update.
self._update_xml() """
return self._xml return self._xml_fetch_helper(refresh_if_necc=True)
def get_xml_no_refresh(self):
"""
Fetch XML, but don't force a refresh. Useful to prevent updating
xml in the tick loop when it's not that important (disk/net stats)
"""
return self._xml_fetch_helper(refresh_if_necc=False)
def get_xml_to_define(self): def get_xml_to_define(self):
# FIXME: This isn't sufficient, since we pull stuff like disk targets # FIXME: This isn't sufficient, since we pull stuff like disk targets
@ -103,6 +110,15 @@ class vmmDomain(gobject.GObject):
self._invalidate_xml() self._invalidate_xml()
return self.get_xml() return self.get_xml()
def _xml_fetch_helper(self, refresh_if_necc):
# Helper to fetch xml with various options
if self._xml is None:
self._update_xml()
elif refresh_if_necc and self._valid_xml:
self._update_xml()
return self._xml
def _update_xml(self): def _update_xml(self):
# Force an xml update. Signal 'config-changed' if domain xml has # Force an xml update. Signal 'config-changed' if domain xml has
# changed since last refresh # changed since last refresh
@ -324,7 +340,7 @@ class vmmDomain(gobject.GObject):
if not self.is_active(): if not self.is_active():
return rx, tx return rx, tx
for netdev in self.get_network_devices(): for netdev in self.get_network_devices(refresh_if_necc=False):
try: try:
io = self.vm.interfaceStats(netdev[4]) io = self.vm.interfaceStats(netdev[4])
if io: if io:
@ -343,7 +359,7 @@ class vmmDomain(gobject.GObject):
if not self.is_active(): if not self.is_active():
return rd, wr return rd, wr
for disk in self.get_disk_devices(): for disk in self.get_disk_devices(refresh_if_necc=False):
try: try:
io = self.vm.blockStats(disk[2]) io = self.vm.blockStats(disk[2])
if io: if io:
@ -744,7 +760,7 @@ class vmmDomain(gobject.GObject):
# [ device_type, unique_attribute(s), hw column label, attr1, attr2, ... ] # [ device_type, unique_attribute(s), hw column label, attr1, attr2, ... ]
# ---------------- # ----------------
def get_disk_devices(self): def get_disk_devices(self, refresh_if_necc=True):
def _parse_disk_devs(ctx): def _parse_disk_devs(ctx):
disks = [] disks = []
ret = ctx.xpathEval("/domain/devices/disk") ret = ctx.xpathEval("/domain/devices/disk")
@ -791,9 +807,9 @@ class vmmDomain(gobject.GObject):
return disks return disks
return self._parse_device_xml(_parse_disk_devs) return self._parse_device_xml(_parse_disk_devs, refresh_if_necc)
def get_network_devices(self): def get_network_devices(self, refresh_if_necc=True):
def _parse_network_devs(ctx): def _parse_network_devs(ctx):
nics = [] nics = []
ret = ctx.xpathEval("/domain/devices/interface") ret = ctx.xpathEval("/domain/devices/interface")
@ -832,7 +848,7 @@ class vmmDomain(gobject.GObject):
typ, model]) typ, model])
return nics return nics
return self._parse_device_xml(_parse_network_devs) return self._parse_device_xml(_parse_network_devs, refresh_if_necc)
def get_input_devices(self): def get_input_devices(self):
def _parse_input_devs(ctx): def _parse_input_devs(ctx):
@ -1051,11 +1067,16 @@ class vmmDomain(gobject.GObject):
return self._parse_device_xml(_parse_hostdev_devs) return self._parse_device_xml(_parse_hostdev_devs)
def _parse_device_xml(self, parse_function): def _parse_device_xml(self, parse_function, refresh_if_necc=True):
def parse_wrap_func(doc, ctx): def parse_wrap_func(doc, ctx):
return parse_function(ctx) return parse_function(ctx)
return util.xml_parse_wrapper(self.get_xml(), parse_wrap_func) if refresh_if_necc:
xml = self.get_xml()
else:
xml = self.get_xml_no_refresh()
return util.xml_parse_wrapper(xml, parse_wrap_func)
def _add_xml_device(self, xml, devxml): def _add_xml_device(self, xml, devxml):
""" """