mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-25 10:03:49 +03:00
Speed up fallback to legacy non-QMP probing
Since we daemonized QEMU for capabilities probing there is a long time if QEMU fails to launch. This is because we're not passing in any virDomainObjPtr instance and thus the monitor code can not check to see if the PID is still alive. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
038cffd831
commit
198c992d26
@ -2307,6 +2307,8 @@ qemuCapsInitQMP(qemuCapsPtr caps,
|
||||
char *pidfile = NULL;
|
||||
qemuCapsHookData hookData;
|
||||
char *archstr;
|
||||
pid_t pid = 0;
|
||||
virDomainObj vm;
|
||||
|
||||
/* the ".sock" sufix is important to avoid a possible clash with a qemu
|
||||
* domain called "capabilities"
|
||||
@ -2360,7 +2362,16 @@ qemuCapsInitQMP(qemuCapsPtr caps,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(mon = qemuMonitorOpen(NULL, &config, true, &callbacks))) {
|
||||
if (virPidFileReadPath(pidfile, &pid) < 0) {
|
||||
VIR_DEBUG("Failed to read pidfile %s", pidfile);
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
memset(&vm, 0, sizeof(vm));
|
||||
vm.pid = pid;
|
||||
|
||||
if (!(mon = qemuMonitorOpen(&vm, &config, true, &callbacks))) {
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
@ -2446,21 +2457,16 @@ cleanup:
|
||||
VIR_FREE(monpath);
|
||||
VIR_FREE(package);
|
||||
|
||||
if (pidfile) {
|
||||
if (pid != 0) {
|
||||
char ebuf[1024];
|
||||
pid_t pid;
|
||||
int rc;
|
||||
|
||||
if ((rc = virPidFileReadPath(pidfile, &pid)) < 0) {
|
||||
VIR_DEBUG("Failed to read pidfile %s: %s",
|
||||
pidfile, virStrerror(-rc, ebuf, sizeof(ebuf)));
|
||||
} else {
|
||||
VIR_DEBUG("Killing QMP caps process %lld", (long long) pid);
|
||||
if (virProcessKill(pid, SIGKILL) < 0 && errno != ESRCH)
|
||||
VIR_ERROR(_("Failed to kill process %lld: %s"),
|
||||
(long long) pid,
|
||||
virStrerror(errno, ebuf, sizeof(ebuf)));
|
||||
}
|
||||
VIR_DEBUG("Killing QMP caps process %lld", (long long) pid);
|
||||
if (virProcessKill(pid, SIGKILL) < 0 && errno != ESRCH)
|
||||
VIR_ERROR(_("Failed to kill process %lld: %s"),
|
||||
(long long) pid,
|
||||
virStrerror(errno, ebuf, sizeof(ebuf)));
|
||||
}
|
||||
if (pidfile) {
|
||||
unlink(pidfile);
|
||||
VIR_FREE(pidfile);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user