This patch alters dumping code, so we can report progress and allow cancel via ^C. --- tools/virsh.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++------- tools/virsh.pod | 8 +++--- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 5f9a9ff..c2440e2 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -3089,26 +3089,36 @@ static const vshCmdOptDef opts_dump[] = { {"reset", VSH_OT_BOOL, 0, N_("reset the domain after core dump")}, {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("where to dump the core")}, + {"verbose", VSH_OT_BOOL, 0, N_("display the progress of dump")}, {NULL, 0, 0, NULL} }; -static bool -cmdDump(vshControl *ctl, const vshCmd *cmd) +static void +doDump(void *opaque) { - virDomainPtr dom; + char ret = '1'; + vshCtrlData *data = opaque; + vshControl *ctl = data->ctl; + const vshCmd *cmd = data->cmd; + virDomainPtr dom = NULL; + sigset_t sigmask, oldsigmask; const char *name = NULL; const char *to = NULL; - bool ret = false; unsigned int flags = 0; + sigemptyset(&sigmask); + sigaddset(&sigmask, SIGINT); + if (pthread_sigmask(SIG_BLOCK, &sigmask, &oldsigmask) < 0) + goto out_sig; + if (!vshConnectionUsability(ctl, ctl->conn)) - return false; + goto out; if (vshCommandOptString(cmd, "file", &to) <= 0) - return false; + goto out; if (!(dom = vshCommandOptDomain(ctl, cmd, &name))) - return false; + goto out; if (vshCommandOptBool (cmd, "live")) flags |= VIR_DUMP_LIVE; @@ -3121,14 +3131,63 @@ cmdDump(vshControl *ctl, const vshCmd *cmd) if (virDomainCoreDump(dom, to, flags) < 0) { vshError(ctl, _("Failed to core dump domain %s to %s"), name, to); - goto cleanup; + goto out; } - vshPrint(ctl, _("Domain %s dumped to %s\n"), name, to); - ret = true; + ret = '0'; +out: + pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL); +out_sig: + if (dom) + virDomainFree (dom); + ignore_value(safewrite(data->writefd, &ret, sizeof(ret))); +} + +static bool +cmdDump(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom; + int p[2] = { -1, -1}; + bool ret = false; + bool verbose = false; + const char *name = NULL; + const char *to = NULL; + vshCtrlData data; + virThread workerThread; + + if (!(dom = vshCommandOptDomain(ctl, cmd, &name))) + return false; + + if (vshCommandOptString(cmd, "file", &to) <= 0) + return false; + + if (vshCommandOptBool (cmd, "verbose")) + verbose = true; + + if (pipe(p) < 0) + goto cleanup; + + data.ctl = ctl; + data.cmd = cmd; + data.writefd = p[1]; + + if (virThreadCreate(&workerThread, + true, + doDump, + &data) < 0) + goto cleanup; + + ret = do_watch_job(ctl, dom, verbose, p[0], 0, NULL, "Dump"); + + virThreadJoin(&workerThread); + + if (ret) + vshPrint(ctl, _("\nDomain %s dumped to %s\n"), name, to); cleanup: virDomainFree(dom); + VIR_FORCE_CLOSE(p[0]); + VIR_FORCE_CLOSE(p[1]); return ret; } diff --git a/tools/virsh.pod b/tools/virsh.pod index dbe5165..5a5fbf8 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -678,7 +678,7 @@ Convert the file I<xml> in domain XML format to the native guest configuration format named by I<format>. =item B<dump> I<domain-id> I<corefilepath> [I<--bypass-cache>] -{ [I<--live>] | [I<--crash>] | [I<--reset>] } +{ [I<--live>] | [I<--crash>] | [I<--reset>] } [I<--verbose>] Dumps the core of a domain to a file for analysis. If I<--live> is specified, the domain continues to run until the core @@ -691,9 +691,9 @@ If I<--bypass-cache> is specified, the save will avoid the file system cache, although this may slow down the operation. The progress may be monitored using B<domjobinfo> virsh command and canceled -with B<domjobabort> command (sent by another virsh instance). Interrupting -(usually with C<Ctrl-C>) the virsh process which runs B<dump> command is not -enough to actually cancel the operation. +with B<domjobabort> command (sent by another virsh instance). Another option +is to send SIGINT (usually with C<Ctrl-C>) to the virsh process running +B<dump> command. I<--verbose> displays the progress of dump. NOTE: Some hypervisors may require the user to manually ensure proper permissions on file and path specified by argument I<corefilepath>. -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list