Permalink
Browse files

Asynchronously get information on libvirt domain

When a libvirt machine is selected, information is fetched for it every
second and the call to fetch the information can take from about 2.5s to
2 *minutes* 45s (currently thats the case due to a regression in libvirt).

https://bugzilla.gnome.org/show_bug.cgi?id=674352
  • Loading branch information...
1 parent 24b5c2f commit f68fe177f7bde7b3d1603bc39e3298b74a65e4f7 @zeenix zeenix committed Apr 19, 2012
Showing with 26 additions and 10 deletions.
  1. +1 −1 configure.ac
  2. +25 −9 src/libvirt-machine.vala
View
@@ -45,7 +45,7 @@ GLIB_MIN_VERSION=2.29.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.9.6
GTK_MIN_VERSION=3.3.5
GTK_VNC_MIN_VERSION=0.4.4
-LIBVIRT_GLIB_MIN_VERSION=0.0.6
+LIBVIRT_GLIB_MIN_VERSION=0.0.8
LIBVIRT_GCONFIG_MIN_VERSION=0.0.8
LIBXML2_MIN_VERSION=2.7.8
SPICE_GTK_MIN_VERSION=0.9
View
@@ -84,11 +84,14 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
private uint ram_update_timeout = 0;
private uint storage_update_timeout = 0;
+ private uint stats_update_timeout;
+ private Cancellable stats_cancellable;
static const int STATS_SIZE = 20;
private MachineStat[] stats;
construct {
stats = new MachineStat[STATS_SIZE];
+ stats_cancellable = new Cancellable ();
}
public void update_domain_config () {
@@ -185,11 +188,11 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
public double[] cpu_stats;
public double[] io_stats;
public double[] net_stats;
- private void update_stats () {
+ private async void update_stats () {
try {
var now = get_monotonic_time ();
var stat = MachineStat () { timestamp = now };
- var info = domain.get_info ();
+ var info = yield domain.get_info_async (stats_cancellable);
update_cpu_stat (info, ref stat);
update_mem_stat (info, ref stat);
@@ -199,6 +202,8 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
stats = stats[1:STATS_SIZE];
stats += stat;
+ } catch (IOError.CANCELLED err) {
+ return;
} catch (GLib.Error err) {
warning (err.message);
}
@@ -216,22 +221,33 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
stats_updated ();
}
- private uint stats_id;
private void set_stats_enable (bool enable) {
if (enable) {
debug ("enable statistics for " + name);
- if (stats_id != 0)
+ if (stats_update_timeout != 0)
return;
- stats_id = Timeout.add_seconds (1, () => {
- update_stats ();
+ stats_cancellable.reset ();
+ var stats_updating = false;
+ stats_update_timeout = Timeout.add_seconds (1, () => {
+ if (stats_updating) {
+ warning ("Fetching of stats for '%s' is taking too long. Probably a libvirt bug.", name);
+
+ return true;
+ }
+
+ stats_updating = true;
+ update_stats.begin (() => { stats_updating = false; });
+
return true;
});
} else {
debug ("disable statistics for " + name);
- if (stats_id != 0)
- GLib.Source.remove (stats_id);
- stats_id = 0;
+ if (stats_update_timeout != 0) {
+ stats_cancellable.cancel ();
+ GLib.Source.remove (stats_update_timeout);
+ }
+ stats_update_timeout = 0;
}
}

0 comments on commit f68fe17

Please sign in to comment.