qemu: agent: handle agent connection errors in one place

qemuConnectAgent return -1 or -2 in case of different errors.
A. -1 is a case of unsuccessuful connection to guest agent.
B. -2 is a case of destoyed domain during connection attempt.

All qemuConnectAgent callers handle the first error the same way
so let's move this logic into qemuConnectAgent itself. Patched
function returns 0 in case A and -1 in case B.
This commit is contained in:
Nikolay Shirokovskiy 2016-11-16 16:43:01 +03:00 committed by Maxim Nestratov
parent 01079727fe
commit 851ae08e3e
3 changed files with 19 additions and 62 deletions

View File

@ -4409,7 +4409,6 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
virObjectEventPtr event = NULL; virObjectEventPtr event = NULL;
virDomainDeviceDef dev; virDomainDeviceDef dev;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
int rc;
if (connected) if (connected)
newstate = VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED; newstate = VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED;
@ -4462,13 +4461,8 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0")) { if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0")) {
if (newstate == VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED) { if (newstate == VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED) {
if (!priv->agent) { if (!priv->agent && qemuConnectAgent(driver, vm) < 0)
if ((rc = qemuConnectAgent(driver, vm)) == -2) goto endjob;
goto endjob;
if (rc < 0)
priv->agentError = true;
}
} else { } else {
if (priv->agent) { if (priv->agent) {
qemuAgentClose(priv->agent); qemuAgentClose(priv->agent);

View File

@ -6183,7 +6183,6 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
unsigned short port; unsigned short port;
unsigned long long timeReceived = 0; unsigned long long timeReceived = 0;
virObjectEventPtr event; virObjectEventPtr event;
int rc;
qemuDomainJobInfoPtr jobInfo = NULL; qemuDomainJobInfoPtr jobInfo = NULL;
bool inPostCopy = false; bool inPostCopy = false;
bool doKill = true; bool doKill = true;
@ -6256,16 +6255,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
QEMU_ASYNC_JOB_MIGRATION_IN) < 0) QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
goto endjob; goto endjob;
if ((rc = qemuConnectAgent(driver, vm)) < 0) { if (qemuConnectAgent(driver, vm) < 0)
if (rc == -2) goto endjob;
goto endjob;
VIR_WARN("Cannot connect to QEMU guest agent for %s",
vm->def->name);
virResetLastError();
priv->agentError = true;
}
if (flags & VIR_MIGRATE_PERSIST_DEST) { if (flags & VIR_MIGRATE_PERSIST_DEST) {
if (qemuMigrationPersist(driver, vm, mig, !v3proto) < 0) { if (qemuMigrationPersist(driver, vm, mig, !v3proto) < 0) {

View File

@ -204,7 +204,6 @@ int
qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm) qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
qemuAgentPtr agent = NULL; qemuAgentPtr agent = NULL;
virDomainChrDefPtr config = qemuFindAgentConfig(vm->def); virDomainChrDefPtr config = qemuFindAgentConfig(vm->def);
@ -248,8 +247,7 @@ qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm)
qemuAgentClose(agent); qemuAgentClose(agent);
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest crashed while connecting to the guest agent")); _("guest crashed while connecting to the guest agent"));
ret = -2; return -1;
goto cleanup;
} }
if (virSecurityManagerClearSocketLabel(driver->securityManager, if (virSecurityManagerClearSocketLabel(driver->securityManager,
@ -260,18 +258,18 @@ qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm)
goto cleanup; goto cleanup;
} }
priv->agent = agent; priv->agent = agent;
if (!priv->agent)
if (priv->agent == NULL) {
VIR_INFO("Failed to connect agent for %s", vm->def->name); VIR_INFO("Failed to connect agent for %s", vm->def->name);
goto cleanup;
}
ret = 0;
cleanup: cleanup:
return ret; if (!priv->agent) {
VIR_WARN("Cannot connect to QEMU guest agent for %s", vm->def->name);
priv->agentError = true;
virResetLastError();
}
return 0;
} }
@ -3268,7 +3266,6 @@ qemuProcessReconnect(void *opaque)
int reason; int reason;
virQEMUDriverConfigPtr cfg; virQEMUDriverConfigPtr cfg;
size_t i; size_t i;
int ret;
unsigned int stopFlags = 0; unsigned int stopFlags = 0;
bool jobStarted = false; bool jobStarted = false;
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
@ -3414,16 +3411,8 @@ qemuProcessReconnect(void *opaque)
qemuProcessReconnectCheckMemAliasOrderMismatch(obj); qemuProcessReconnectCheckMemAliasOrderMismatch(obj);
/* Failure to connect to agent shouldn't be fatal */ if (qemuConnectAgent(driver, obj) < 0)
if ((ret = qemuConnectAgent(driver, obj)) < 0) { goto error;
if (ret == -2)
goto error;
VIR_WARN("Cannot connect to QEMU guest agent for %s",
obj->def->name);
virResetLastError();
priv->agentError = true;
}
/* update domain state XML with possibly updated state in virDomainObj */ /* update domain state XML with possibly updated state in virDomainObj */
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, obj, driver->caps) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, obj, driver->caps) < 0)
@ -5565,16 +5554,8 @@ qemuProcessLaunch(virConnectPtr conn,
if (qemuProcessWaitForMonitor(driver, vm, asyncJob, priv->qemuCaps, logCtxt) < 0) if (qemuProcessWaitForMonitor(driver, vm, asyncJob, priv->qemuCaps, logCtxt) < 0)
goto cleanup; goto cleanup;
/* Failure to connect to agent shouldn't be fatal */ if (qemuConnectAgent(driver, vm) < 0)
if ((rv = qemuConnectAgent(driver, vm)) < 0) { goto cleanup;
if (rv == -2)
goto cleanup;
VIR_WARN("Cannot connect to QEMU guest agent for %s",
vm->def->name);
virResetLastError();
priv->agentError = true;
}
VIR_DEBUG("Detecting if required emulator features are present"); VIR_DEBUG("Detecting if required emulator features are present");
if (!qemuProcessVerifyGuestCPU(driver, vm, asyncJob)) if (!qemuProcessVerifyGuestCPU(driver, vm, asyncJob))
@ -6264,7 +6245,6 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
bool active = false; bool active = false;
int ret;
VIR_DEBUG("Beginning VM attach process"); VIR_DEBUG("Beginning VM attach process");
@ -6391,16 +6371,8 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, priv->qemuCaps, NULL) < 0) if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, priv->qemuCaps, NULL) < 0)
goto error; goto error;
/* Failure to connect to agent shouldn't be fatal */ if (qemuConnectAgent(driver, vm) < 0)
if ((ret = qemuConnectAgent(driver, vm)) < 0) { goto error;
if (ret == -2)
goto error;
VIR_WARN("Cannot connect to QEMU guest agent for %s",
vm->def->name);
virResetLastError();
priv->agentError = true;
}
VIR_DEBUG("Detecting VCPU PIDs"); VIR_DEBUG("Detecting VCPU PIDs");
if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE, false) < 0) if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE, false) < 0)