cmd->vm->pid = cmd->pid;
- if (!(cmd->mon = qemuMonitorOpen(cmd->vm, &cmd->config, true,
+ if (!(cmd->mon = qemuMonitorOpen(cmd->vm, &cmd->config, true, true,
0, &callbacks, NULL)))
goto ignore;
static int
qemuMonitorOpenUnix(const char *monitor,
pid_t cpid,
+ bool retry,
unsigned long long timeout)
{
struct sockaddr_un addr;
goto error;
}
- if (virTimeBackOffStart(&timebackoff, 1, timeout * 1000) < 0)
- goto error;
- while (virTimeBackOffWait(&timebackoff)) {
- ret = connect(monfd, (struct sockaddr *)&addr, sizeof(addr));
-
- if (ret == 0)
- break;
+ if (retry) {
+ if (virTimeBackOffStart(&timebackoff, 1, timeout * 1000) < 0)
+ goto error;
+ while (virTimeBackOffWait(&timebackoff)) {
+ ret = connect(monfd, (struct sockaddr *)&addr, sizeof(addr));
- if ((errno == ENOENT || errno == ECONNREFUSED) &&
- (!cpid || virProcessKill(cpid, 0) == 0)) {
- /* ENOENT : Socket may not have shown up yet
- * ECONNREFUSED : Leftover socket hasn't been removed yet */
- continue;
- }
+ if (ret == 0)
+ break;
- virReportSystemError(errno, "%s",
- _("failed to connect to monitor socket"));
- goto error;
+ if ((errno == ENOENT || errno == ECONNREFUSED) &&
+ (!cpid || virProcessKill(cpid, 0) == 0)) {
+ /* ENOENT : Socket may not have shown up yet
+ * ECONNREFUSED : Leftover socket hasn't been removed yet */
+ continue;
+ }
- }
+ virReportSystemError(errno, "%s",
+ _("failed to connect to monitor socket"));
+ goto error;
+ }
- if (ret != 0) {
- virReportSystemError(errno, "%s",
- _("monitor socket did not show up"));
- goto error;
+ if (ret != 0) {
+ virReportSystemError(errno, "%s",
+ _("monitor socket did not show up"));
+ goto error;
+ }
+ } else {
+ ret = connect(monfd, (struct sockaddr *) &addr, sizeof(addr));
+ if (ret < 0) {
+ virReportSystemError(errno, "%s",
+ _("failed to connect to monitor socket"));
+ goto error;
+ }
}
return monfd;
qemuMonitorOpen(virDomainObjPtr vm,
virDomainChrSourceDefPtr config,
bool json,
+ bool retry,
unsigned long long timeout,
qemuMonitorCallbacksPtr cb,
void *opaque)
case VIR_DOMAIN_CHR_TYPE_UNIX:
hasSendFD = true;
if ((fd = qemuMonitorOpenUnix(config->data.nix.path,
- vm->pid, timeout)) < 0)
+ vm->pid, retry, timeout)) < 0)
return NULL;
break;
qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm,
virDomainChrSourceDefPtr config,
bool json,
+ bool retry,
unsigned long long timeout,
qemuMonitorCallbacksPtr cb,
void *opaque)
static int
qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
- qemuDomainLogContextPtr logCtxt)
+ bool retry, qemuDomainLogContextPtr logCtxt)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuMonitorPtr mon = NULL;
mon = qemuMonitorOpen(vm,
monConfig,
priv->monJSON,
+ retry,
timeout,
&monitorCallbacks,
driver);
{
int ret = -1;
virHashTablePtr info = NULL;
- qemuDomainObjPrivatePtr priv;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ bool retry = true;
+
+ if (priv->qemuCaps &&
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS))
+ retry = false;
- VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
- if (qemuConnectMonitor(driver, vm, asyncJob, logCtxt) < 0)
+ VIR_DEBUG("Connect monitor to vm=%p name='%s' retry=%d",
+ vm, vm->def->name, retry);
+
+ if (qemuConnectMonitor(driver, vm, asyncJob, retry, logCtxt) < 0)
goto cleanup;
/* Try to get the pty path mappings again via the monitor. This is much more
* reliable if it's available.
* Note that the monitor itself can be on a pty, so we still need to try the
* log output method. */
- priv = vm->privateData;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup;
ret = qemuMonitorGetChardevInfo(priv->mon, &info);
unsigned int stopFlags = 0;
bool jobStarted = false;
virCapsPtr caps = NULL;
+ bool retry = true;
VIR_FREE(data);
* allowReboot in status XML and we need to initialize it. */
qemuProcessPrepareAllowReboot(obj);
- VIR_DEBUG("Reconnect monitor to %p '%s'", obj, obj->def->name);
+ if (priv->qemuCaps &&
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS))
+ retry = false;
+
+ VIR_DEBUG("Reconnect monitor to def=%p name='%s' retry=%d",
+ obj, obj->def->name, retry);
/* XXX check PID liveliness & EXE path */
- if (qemuConnectMonitor(driver, obj, QEMU_ASYNC_JOB_NONE, NULL) < 0)
+ if (qemuConnectMonitor(driver, obj, QEMU_ASYNC_JOB_NONE, retry, NULL) < 0)
goto error;
if (qemuHostdevUpdateActiveDomainDevices(driver, obj->def) < 0)
if (!(test->mon = qemuMonitorOpen(test->vm,
&src,
json,
+ true,
0,
&qemuMonitorTestCallbacks,
driver)))