If virDomainMemoryStats is called too soon after domain startup,
QEMU returns:
"error":{"class":"GenericError","desc":"guest
hasn't updated any stats yet"}
when we try to query balloon stats.
Check for this reply and log it as OPERATION_INVALID instead of
INTERNAL_ERROR. This means the daemon only logs it at the debug level,
without polluting system logs.
Reported by Laszlo Pal:
https://www.redhat.com/archives/libvirt-users/2014-May/msg00023.html
---
v1:
https://www.redhat.com/archives/libvir-list/2014-May/msg00420.html
v2:
return 0 in this case - even though balloon stats are not yet available,
we can still return 'rss' in qemuDomainMemoryStats
jump to cleanup if CheckError returns < 0
src/qemu/qemu_monitor_json.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index f8ab975..914f3ef 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1465,12 +1465,22 @@ int qemuMonitorJSONGetMemoryStats(qemuMonitorPtr mon,
NULL)))
goto cleanup;
- ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+ if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
+ goto cleanup;
- if (ret == 0)
- ret = qemuMonitorJSONCheckError(cmd, reply);
+ if ((data = virJSONValueObjectGet(reply, "error"))) {
+ const char *klass = virJSONValueObjectGetString(data, "class");
+ const char *desc = virJSONValueObjectGetString(data, "desc");
- if (ret < 0)
+ if (STREQ_NULLABLE(klass, "GenericError") &&
+ STREQ_NULLABLE(desc, "guest hasn't updated any stats yet")) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("the guest hasn't updated any stats yet"));
+ goto cleanup;
+ }
+ }
+
+ if ((ret = qemuMonitorJSONCheckError(cmd, reply)) < 0)
goto cleanup;
if (!(data = virJSONValueObjectGet(reply, "return"))) {
--
1.8.3.2