Add doDumpCoreToAutoPath to implement 'coredump-destroy' and 'coredump-restart' events of the 'on_crash' in the XML when domain crashed. --- src/qemu/qemu_driver.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 24df772..eefe7a2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3513,6 +3513,59 @@ cleanup: virObjectUnref(cfg); } +static int +doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, + virDomainObjPtr vm, + unsigned int flags) +{ + int ret = -1; + char *dumpfile = NULL; + time_t curtime = time(NULL); + char timestr[100]; + struct tm time_info; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + + localtime_r(&curtime, &time_info); + strftime(timestr, sizeof(timestr), "%Y-%m-%d-%H:%M:%S", &time_info); + + if (virAsprintf(&dumpfile, "%s/%s-%s", + cfg->autoDumpPath, + vm->def->name, + timestr) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (qemuDomainObjBeginAsyncJob(driver, vm, + QEMU_ASYNC_JOB_DUMP) < 0) { + goto cleanup; + } + + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + goto endjob; + } + + flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0; + ret = doCoreDump(driver, vm, dumpfile, + getCompressionType(driver), flags); + if (ret < 0) + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Dump failed")); + +endjob: + /* Safe to ignore value since ref count was incremented in + * qemuProcessHandleGuestPanic(). + */ + ignore_value(qemuDomainObjEndAsyncJob(driver, vm)); + +cleanup: + VIR_FREE(dumpfile); + virObjectUnref(cfg); + return ret; +} + static void processGuestPanicEvent(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -3549,6 +3602,12 @@ processGuestPanicEvent(virQEMUDriverPtr driver, } switch (action) { + case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY: + if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0) { + goto cleanup; + } + /* fall through */ + case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY: priv->beingDestroyed = true; @@ -3580,6 +3639,12 @@ processGuestPanicEvent(virQEMUDriverPtr driver, } break; + case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART: + if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0) { + goto cleanup; + } + /* fall through */ + case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART: qemuDomainSetFakeReboot(driver, vm, true); qemuProcessShutdownOrReboot(driver, vm); -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list