Cleanup was not happening properly if a migration to RHEV was killed
prematurely with a Ctrl-C. Firstly, the SIGINT and SIGQUIT handlers were not
being registered early enough in virt-v2v.pl. Secondly, if Ctrl-C killed the
guestfs qemu process first it would deliver a SIGPIPE to v2v, which caused an
unclean shutdown without cleanup.
Fixes RHBZ#596015
---
v2v/virt-v2v.pl | 17 ++++++++++++++---
1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/v2v/virt-v2v.pl b/v2v/virt-v2v.pl
index bed69a0..36297ed 100755
--- a/v2v/virt-v2v.pl
+++ b/v2v/virt-v2v.pl
@@ -214,6 +214,14 @@ Display version number and exit.
=cut
+$SIG{'INT'} = \&signal_exit;
+$SIG{'QUIT'} = \&signal_exit;
+
+# SIGPIPE will cause an untidy exit of the perl process, without calling
+# destructors. We don't rely on it anywhere, as we check for errors when reading
+# from or writing to a pipe.
+$SIG{'PIPE'} = 'IGNORE';
+
# Initialise the message output prefix
Sys::VirtV2V::UserMessage->set_identifier('virt-v2v');
@@ -362,9 +370,6 @@ if ($output_method eq 'rhev') {
$> = "0";
}
-$SIG{'INT'} = \&close_guest_handle;
-$SIG{'QUIT'} = \&close_guest_handle;
-
# Inspect the guest
my $os = inspect_guest($g);
@@ -425,6 +430,12 @@ sub close_guest_handle
}
}
+sub signal_exit
+{
+ close_guest_handle();
+ exit(1);
+}
+
sub get_guestfs_handle
{
my ($storage, $transferiso) = @_;
--
1.7.0.1