From 8682f6fcb19ef5316e4c9c44e41aa74e9f60d438 Mon Sep 17 00:00:00 2001 From: Wolfgang Link Date: Tue, 30 Dec 2014 14:30:11 +0100 Subject: [PATCH] Fix backup failure at shutdown. This fix include a new function of vzdump. Now you can call vzdump -stop and the backup will be aborted. Also if the pve-manager init script stop the process, vzdump -stop will called. Signed-off-by: Wolfgang Link --- PVE/API2/VZDump.pm | 4 +++ PVE/VZDump.pm | 55 ++++++++++++++++++++++++++++++++++++++++-- bin/init.d/pve-manager | 2 ++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm index 98b0b6d8..3ae98de7 100644 --- a/PVE/API2/VZDump.pm +++ b/PVE/API2/VZDump.pm @@ -63,6 +63,10 @@ __PACKAGE__->register_method ({ # silent exit if we run on wrong node exit(0) if $param->{node} && $param->{node} ne $nodename; + + if($param->{stop}){ + PVE::VZDump::stop_all_backups; + } my $cmdline = PVE::VZDump::command_line($param); diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm index 147326f3..4144790a 100644 --- a/PVE/VZDump.pm +++ b/PVE/VZDump.pm @@ -22,6 +22,8 @@ my @posix_filesystems = qw(ext3 ext4 nfs nfs4 reiserfs xfs); my $lockfile = '/var/run/vzdump.lock'; +my $pidfile = '/var/run/vzdump.pid'; + my $logdir = '/var/log/vzdump'; my @plugins = qw (PVE::VZDump::OpenVZ); @@ -210,6 +212,8 @@ sub read_vzdump_defaults { $res->{lockwait} = int($1); } elsif ($line =~ m/stopwait:\s*(\d+)\s*$/) { $res->{stopwait} = int($1); + } elsif ($line =~ m/stop:\s*(\d+)\s*$/) { + $res->{stop} = int($1); } elsif ($line =~ m/size:\s*(\d+)\s*$/) { $res->{size} = int($1); } elsif ($line =~ m/maxfiles:\s*(\d+)\s*$/) { @@ -596,6 +600,15 @@ sub get_lvm_device { sub getlock { my ($self) = @_; + my $fh; + + open($fh, "> $pidfile") + or die "cannot open $pidfile: $!"; + + print $fh $$, "\n",PVE::ProcFSTools::read_proc_starttime($$), "\n"; + + close $fh || warn "close $pidfile failed: $!"; + my $maxwait = $self->{opts}->{lockwait} || $self->{lockwait}; if (!open (SERVER_FLCK, ">>$lockfile")) { @@ -1013,6 +1026,11 @@ sub exec_backup { my $opts = $self->{opts}; + if ($opts->{stop}) { + stop_all_backups($self); + return; + } + debugmsg ('info', "starting new backup job: $self->{cmdline}", undef, 1); debugmsg ('info', "skip external VMs: " . join(', ', @{$self->{skiplist}})) if scalar(@{$self->{skiplist}}); @@ -1078,6 +1096,8 @@ sub exec_backup { die $err if $err; die "job errors\n" if $errcount; + + unlink $pidfile; } my $confdesc = { @@ -1163,6 +1183,12 @@ my $confdesc = { description => "Store resulting file to this storage.", optional => 1, }), + stop => { + type => 'boolean', + description => "Stop all current runnig backup jobs on this host.", + optional => 1, + default => 0, + }, size => { type => 'integer', description => "LVM snapshot size in MB.", @@ -1228,7 +1254,7 @@ sub verify_vzdump_parameters { my ($param, $check_missing) = @_; raise_param_exc({ all => "option conflicts with option 'vmid'"}) - if $param->{all} && $param->{vmid}; + if ($param->{all} || $param->{stop}) && $param->{vmid}; raise_param_exc({ exclude => "option conflicts with option 'vmid'"}) if $param->{exclude} && $param->{vmid}; @@ -1238,8 +1264,33 @@ sub verify_vzdump_parameters { return if !$check_missing; raise_param_exc({ vmid => "property is missing"}) - if !$param->{all} && !$param->{vmid}; + if !($param->{all} || $param->{stop}) && !$param->{vmid}; + +} + +sub stop_all_backups { + my($self) = @_; + + return if ! -e $pidfile; + + my @param = split(/\n/,PVE::Tools::file_get_contents($pidfile)); + my $pid; + my $stime; + + if ($param[0] =~ /^([-\@\w.]+)$/){ + $pid = $1; + } + if ($param[1] =~/^([-\@\w.]+)$/){ + $stime = $1; + } + + if(PVE::ProcFSTools::check_process_running($pid, $stime) && + PVE::ProcFSTools::read_proc_starttime($pid) == $stime){ + print "toll"; + kill(15,$pid); + } + unlink $pidfile; } sub command_line { diff --git a/bin/init.d/pve-manager b/bin/init.d/pve-manager index b887ed36..6540425a 100755 --- a/bin/init.d/pve-manager +++ b/bin/init.d/pve-manager @@ -31,6 +31,8 @@ case "$1" in pvesh --nooutput create /nodes/localhost/startall ;; stop) + echo "Stopping all running Backups" + vzdump -stop echo "Stopping VMs and Containers" pvesh --nooutput create /nodes/localhost/stopall ;; -- 2.39.2