On 01/26/2011 07:12 AM, Daniel P. Berrange wrote:
I reckon closing the FD + SIGTERM is sufficient. GZip isn't
sufficiently complicated that it will hang needing SIGKILL
How about this?
I do notice that these two fd's end up getting closed further down
anyway (even if we've failed, we still waitpid, close the
intermediatefd, then call qemudDomainSaveImageClose() to close fd. So
it's really a matter of timing - is it better to close the fd's
earlier and give gzip a chance to die a more natural death, or is it
okay to just give it one to the head, and clean up the fd's later?
---
src/qemu/qemu_driver.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b6a5cd6..23e0db0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5770,6 +5770,15 @@ qemudDomainSaveImageStartVM(virConnectPtr conn,
VIR_VM_OP_RESTORE);
if (intermediate_pid != -1) {
+ if (ret < 0) {
+ /* if there was an error setting up qemu, the intermediate process will
+ * wait forever to write to stdout, so we must manually kill it.
+ */
+ VIR_FORCE_CLOSE(intermediatefd);
+ VIR_FORCE_CLOSE(fd);
+ kill(intermediate_pid, SIGTERM);
+ }
+
/* Wait for intermediate process to exit */
while (waitpid(intermediate_pid, &childstat, 0) == -1 &&
errno == EINTR) {
--
1.7.3.4