[libvirt] [PATCH 2/2] qemuDomainObjBeginJobInternal: Report agent job in error message
Michal Prívozník
mprivozn at redhat.com
Mon Jun 25 05:37:21 UTC 2018
On 06/22/2018 10:07 AM, Jiri Denemark wrote:
> On Wed, Jun 20, 2018 at 14:32:04 +0200, Michal Privoznik wrote:
>> If a thread is unable to acquire a job (e.g. because of timeout)
>> an error is reported and the error message contains reference to
>> the other thread holding the job. Well, the error message should
>> report agent job too as it is yet another source of possible
>> failure.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/qemu/qemu_domain.c | 26 ++++++++++++++++----------
>> 1 file changed, 16 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 827597d5f3..4331b95917 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -6420,6 +6420,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
>> bool async = job == QEMU_JOB_ASYNC;
>> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>> const char *blocker = NULL;
>> + const char *agentBlocker = NULL;
>> int ret = -1;
>> unsigned long long duration = 0;
>> unsigned long long agentDuration = 0;
>> @@ -6549,16 +6550,21 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
>> priv->job.apiFlags,
>> duration / 1000, agentDuration / 1000, asyncDuration / 1000);
>>
>> - if (nested || qemuDomainNestedJobAllowed(priv, job))
>> - blocker = priv->job.ownerAPI;
>> - else
>> - blocker = priv->job.asyncOwnerAPI;
>> + if (job) {
>> + if (nested || qemuDomainNestedJobAllowed(priv, job))
>> + blocker = priv->job.ownerAPI;
>> + else
>> + blocker = priv->job.asyncOwnerAPI;
>> + }
>> +
>> + if (agentJob)
>> + agentBlocker = priv->job.agentOwnerAPI;
>>
>> if (errno == ETIMEDOUT) {
>> - if (blocker) {
>> + if (blocker || agentBlocker) {
>> virReportError(VIR_ERR_OPERATION_TIMEOUT,
>> - _("cannot acquire state change lock (held by %s)"),
>> - blocker);
>> + _("cannot acquire state change lock (held by %s %s)"),
>> + NULLSTR(blocker), NULLSTR(agentBlocker));
>
> Since this is an error message reported to the user I think we should
> make it a little bit more user friendly. It would be nice to distinguish
> state change lock and agent lock and only print the relevant blocker
> (rather than both when one of them is NULL). And when both blockers are
> reported, we should separate them better, e.g., "%s and %s".
I thought about it too, but then decided to take the easy way out
because this would end up being a spaghetti code in my sight. But okay,
I will rework this to:
if (blocker && agentBlocker) {
...
} else if (blocker) {
...
} else if (agentBlocker) {
...
} else {
...
}
where all four bodies are merely the same (only the error message would
change - hence the spaghetti code).
Michal
More information about the libvir-list
mailing list