[PATCH 0/4] qemu: log spamming fixes

While going through oVirt logs I found that libvirt totally spams logs in certain cases. Peter Krempa (4): qemu: agent: Make fetching of 'can-offline' member from 'guest-query-vcpus' optional conf: domain: Add comment for 'virDomainObjTaint' qemu: domain: Fix logic when tainting domain qemu: domain: Unexport qemuDomainObjTaintMsg src/conf/domain_conf.c | 13 +++++++++++-- src/qemu/qemu_agent.c | 8 ++------ src/qemu/qemu_domain.c | 32 +++++++++++++++++--------------- src/qemu/qemu_domain.h | 7 ------- 4 files changed, 30 insertions(+), 30 deletions(-) -- 2.39.2

The 'can-offline' member is optional according to agent's schema and in fact in certain cases it's not returned. Libvirt then spams the logs if something is polling the bulk guest stats API. Noticed when going through oVirt logs which appears to call the bulk stats API repeatedly. Instead of requiring it we simply reply that the vCPU can't be offlined. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_agent.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index f20bc4e6a7..b5aa518d55 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1366,12 +1366,8 @@ qemuAgentGetVCPUs(qemuAgent *agent, return -1; } - if (virJSONValueObjectGetBoolean(entry, "can-offline", - &in->offlinable) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("'can-offline' missing in reply of guest-get-vcpus")); - return -1; - } + in->offlinable = false; + ignore_value(virJSONValueObjectGetBoolean(entry, "can-offline", &in->offlinable)); } return ndata; -- 2.39.2

Outline what the function does, especially the return value. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 84ffd93b7f..39ddfb7db0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1915,8 +1915,17 @@ virDomainBlkioDeviceParseXML(xmlNodePtr root, } -bool virDomainObjTaint(virDomainObj *obj, - virDomainTaintFlags taint) +/** + * virDomainObjTaint: + * @obj: domain object + * @taint: domain taint flag + * + * Marks @obj as tainted by @taint. Returns 'false' if @obj already has + * been tainted with @taint. + */ +bool +virDomainObjTaint(virDomainObj *obj, + virDomainTaintFlags taint) { unsigned int flag = (1 << taint); -- 2.39.2

Originally the code was skipping all repeated taints with the same taint flag but a logic bug introduced in commit 30626ed15b239c424ae inverted the condition. This caused that actually the first occurence was NOT logged but any subsequent was. This was noticed when going through oVirt logs as they use custom guest agent commands and the logs are totally spammed with this message. Fixes: 30626ed15b239c424ae891f096057a696eadd715 Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4cf9a259ea..40d5efd750 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6663,7 +6663,7 @@ void qemuDomainObjTaintMsg(virQEMUDriver *driver, const char *extrasuffix = ""; va_list args; - if (virDomainObjTaint(obj, taint)) { + if (!virDomainObjTaint(obj, taint)) { /* If an extra message was given we must always * emit the taint warning, otherwise it is a * one-time only warning per VM -- 2.39.2

The function is used only inside qemu_domain.c unexport and move it above it's user. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 30 ++++++++++++++++-------------- src/qemu/qemu_domain.h | 7 ------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 40d5efd750..a083e7e1ef 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6638,20 +6638,12 @@ qemuDomainDefFormatLive(virQEMUDriver *driver, } -void qemuDomainObjTaint(virQEMUDriver *driver, - virDomainObj *obj, - virDomainTaintFlags taint, - qemuDomainLogContext *logCtxt) -{ - qemuDomainObjTaintMsg(driver, obj, taint, logCtxt, NULL); - qemuDomainSaveStatus(obj); -} - -void qemuDomainObjTaintMsg(virQEMUDriver *driver, - virDomainObj *obj, - virDomainTaintFlags taint, - qemuDomainLogContext *logCtxt, - const char *fmt, ...) +static void G_GNUC_PRINTF(5, 6) +qemuDomainObjTaintMsg(virQEMUDriver *driver, + virDomainObj *obj, + virDomainTaintFlags taint, + qemuDomainLogContext *logCtxt, + const char *fmt, ...) { virErrorPtr orig_err = NULL; g_autofree char *timestamp = NULL; @@ -6725,6 +6717,16 @@ void qemuDomainObjTaintMsg(virQEMUDriver *driver, virErrorRestore(&orig_err); } + +void qemuDomainObjTaint(virQEMUDriver *driver, + virDomainObj *obj, + virDomainTaintFlags taint, + qemuDomainLogContext *logCtxt) +{ + qemuDomainObjTaintMsg(driver, obj, taint, logCtxt, NULL); + qemuDomainSaveStatus(obj); +} + static void qemuDomainObjCheckMachineTaint(virQEMUDriver *driver, virDomainObj *obj, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 6adc067681..54c2e02557 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -629,13 +629,6 @@ void qemuDomainObjTaint(virQEMUDriver *driver, virDomainTaintFlags taint, qemuDomainLogContext *logCtxt); -void qemuDomainObjTaintMsg(virQEMUDriver *driver, - virDomainObj *obj, - virDomainTaintFlags taint, - qemuDomainLogContext *logCtxt, - const char *msg, - ...) G_GNUC_PRINTF(5, 6); - char **qemuDomainObjGetTainting(virQEMUDriver *driver, virDomainObj *obj); -- 2.39.2

On a Wednesday in 2023, Peter Krempa wrote:
The function is used only inside qemu_domain.c unexport and move it
Missing interpunction before "unexport"
above it's user.
*its Spellchecked-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 30 ++++++++++++++++-------------- src/qemu/qemu_domain.h | 7 ------- 2 files changed, 16 insertions(+), 21 deletions(-)

On 3/1/23 11:28 AM, Peter Krempa wrote:
While going through oVirt logs I found that libvirt totally spams logs in certain cases.
Peter Krempa (4): qemu: agent: Make fetching of 'can-offline' member from 'guest-query-vcpus' optional conf: domain: Add comment for 'virDomainObjTaint' qemu: domain: Fix logic when tainting domain qemu: domain: Unexport qemuDomainObjTaintMsg
Reviewed-by: Laine Stump <laine@redhat.com> for all 4.
src/conf/domain_conf.c | 13 +++++++++++-- src/qemu/qemu_agent.c | 8 ++------ src/qemu/qemu_domain.c | 32 +++++++++++++++++--------------- src/qemu/qemu_domain.h | 7 ------- 4 files changed, 30 insertions(+), 30 deletions(-)
participants (3)
-
Ján Tomko
-
Laine Stump
-
Peter Krempa