From: "Daniel P. Berrange" <berra...@redhat.com> In debugging a recent oVirt/libvirt race condition, I was very frustrated by lack of logging in the job enter/exit code. This patch adds some key data which would have been useful in by debugging attempts.
Signed-off-by: Daniel P. Berrange <berra...@redhat.com> --- src/qemu/qemu_domain.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b8aec2d..81d0ba9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1014,6 +1014,12 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, bool nested = job == QEMU_JOB_ASYNC_NESTED; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + VIR_DEBUG("Starting %s: %s (async=%s vm=%p name=%s)", + job == QEMU_JOB_ASYNC ? "async job" : "job", + qemuDomainJobTypeToString(job), + qemuDomainAsyncJobTypeToString(priv->job.asyncJob), + obj, obj->def->name); + priv->jobs_queued++; if (virTimeMillisNow(&now) < 0) { @@ -1032,11 +1038,13 @@ retry: } while (!nested && !qemuDomainNestedJobAllowed(priv, job)) { + VIR_DEBUG("Waiting for async job (vm=%p name=%s)", obj, obj->def->name); if (virCondWaitUntil(&priv->job.asyncCond, &obj->parent.lock, then) < 0) goto error; } while (priv->job.active) { + VIR_DEBUG("Waiting for job (vm=%p name=%s)", obj, obj->def->name); if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0) goto error; } @@ -1049,14 +1057,16 @@ retry: qemuDomainObjResetJob(priv); if (job != QEMU_JOB_ASYNC) { - VIR_DEBUG("Starting job: %s (async=%s)", + VIR_DEBUG("Started job: %s (async=%s vm=%p name=%s)", qemuDomainJobTypeToString(job), - qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); + qemuDomainAsyncJobTypeToString(priv->job.asyncJob), + obj, obj->def->name); priv->job.active = job; priv->job.owner = virThreadSelfID(); } else { - VIR_DEBUG("Starting async job: %s", - qemuDomainAsyncJobTypeToString(asyncJob)); + VIR_DEBUG("Started async job: %s (vm=%p name=%s)", + qemuDomainAsyncJobTypeToString(asyncJob), + obj, obj->def->name); qemuDomainObjResetAsyncJob(priv); priv->job.asyncJob = asyncJob; priv->job.asyncOwner = virThreadSelfID(); @@ -1161,9 +1171,10 @@ bool qemuDomainObjEndJob(virQEMUDriverPtr driver, virDomainObjPtr obj) priv->jobs_queued--; - VIR_DEBUG("Stopping job: %s (async=%s)", + VIR_DEBUG("Stopping job: %s (async=%s vm=%p name=%s)", qemuDomainJobTypeToString(job), - qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); + qemuDomainAsyncJobTypeToString(priv->job.asyncJob), + obj, obj->def->name); qemuDomainObjResetJob(priv); if (qemuDomainTrackJob(job)) @@ -1180,8 +1191,9 @@ qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj) priv->jobs_queued--; - VIR_DEBUG("Stopping async job: %s", - qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); + VIR_DEBUG("Stopping async job: %s (vm=%p name=%s)", + qemuDomainAsyncJobTypeToString(priv->job.asyncJob), + obj, obj->def->name); qemuDomainObjResetAsyncJob(priv); qemuDomainObjSaveJob(driver, obj); @@ -1195,8 +1207,9 @@ qemuDomainObjAbortAsyncJob(virDomainObjPtr obj) { qemuDomainObjPrivatePtr priv = obj->privateData; - VIR_DEBUG("Requesting abort of async job: %s", - qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); + VIR_DEBUG("Requesting abort of async job: %s (vm=%p name=%s)", + qemuDomainAsyncJobTypeToString(priv->job.asyncJob), + obj, obj->def->name); priv->job.asyncAbort = true; } @@ -1232,6 +1245,8 @@ qemuDomainObjEnterMonitorInternal(virQEMUDriverPtr driver, " monitor without asking for a nested job is dangerous"); } + VIR_DEBUG("Entering monitor (mon=%p vm=%p name=%s)", + priv->mon, obj, obj->def->name); virObjectLock(priv->mon); virObjectRef(priv->mon); ignore_value(virTimeMillisNow(&priv->monStart)); @@ -1253,6 +1268,8 @@ qemuDomainObjExitMonitorInternal(virQEMUDriverPtr driver, virObjectUnlock(priv->mon); virObjectLock(obj); + VIR_DEBUG("Exited monitor (mon=%p vm=%p name=%s)", + priv->mon, obj, obj->def->name); priv->monStart = 0; if (!hasRefs) @@ -1321,6 +1338,8 @@ qemuDomainObjEnterAgent(virDomainObjPtr obj) { qemuDomainObjPrivatePtr priv = obj->privateData; + VIR_DEBUG("Entering agent (agent=%p vm=%p name=%s)", + priv->agent, obj, obj->def->name); virObjectLock(priv->agent); virObjectRef(priv->agent); ignore_value(virTimeMillisNow(&priv->agentStart)); @@ -1344,6 +1363,8 @@ qemuDomainObjExitAgent(virDomainObjPtr obj) virObjectUnlock(priv->agent); virObjectLock(obj); + VIR_DEBUG("Exited agent (agent=%p vm=%p name=%s)", + priv->agent, obj, obj->def->name); priv->agentStart = 0; if (!hasRefs) @@ -1352,6 +1373,8 @@ qemuDomainObjExitAgent(virDomainObjPtr obj) void qemuDomainObjEnterRemote(virDomainObjPtr obj) { + VIR_DEBUG("Entering remote (vm=%p name=%s)", + obj, obj->def->name); virObjectRef(obj); virObjectUnlock(obj); } @@ -1359,6 +1382,8 @@ void qemuDomainObjEnterRemote(virDomainObjPtr obj) void qemuDomainObjExitRemote(virDomainObjPtr obj) { virObjectLock(obj); + VIR_DEBUG("Exited remote (vm=%p name=%s)", + obj, obj->def->name); virObjectUnref(obj); } -- 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list