From 1f56f6f8d1b70e8906cc30eafa06e20ab366e3c6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Dominic=20J=C3=A4ger?= Date: Mon, 15 Jul 2019 12:28:20 +0200 Subject: [PATCH] Fix #582: Add DELETE delay logic MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Previously, the web GUI timed out when removing content (e.g. backup) took too long. Doing the main part of the API DELETE call in a fork_worker solves this. Signed-off-by: Dominic Jäger --- PVE/API2/Storage/Content.pm | 45 +++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/PVE/API2/Storage/Content.pm b/PVE/API2/Storage/Content.pm index cd4746b..9731720 100644 --- a/PVE/API2/Storage/Content.pm +++ b/PVE/API2/Storage/Content.pm @@ -285,9 +285,16 @@ __PACKAGE__->register_method ({ type => 'string', completion => \&PVE::Storage::complete_volume, }, + delay => { + type => 'integer', + description => "Time to wait for the task to finish. We return 'null' if the task finish within that time.", + minimum => 1, + maximum => 30, + optional => 1, + }, }, }, - returns => { type => 'null' }, + returns => { type => 'string', optional => 1, }, code => sub { my ($param) = @_; @@ -306,16 +313,36 @@ __PACKAGE__->register_method ({ $rpcenv->check($authuser, "/storage/$storeid", ['Datastore.Allocate']); } - PVE::Storage::vdisk_free ($cfg, $volid); + my $worker = sub { + PVE::Storage::vdisk_free ($cfg, $volid); + print "Removed volume '$volid'\n"; + if ($vtype eq 'backup' + && $path =~ /(.*\/vzdump-\w+-\d+-\d{4}_\d{2}_\d{2}-\d{2}_\d{2}_\d{2})[^\/]+$/) { + my $logpath = "$1.log"; + # try to cleanup our backup log file too, if still exisiting, #318 + unlink($logpath) if -e $logpath; + } + }; - if ($vtype eq 'backup' - && $path =~ /(.*\/vzdump-\w+-\d+-\d{4}_\d{2}_\d{2}-\d{2}_\d{2}_\d{2})[^\/]+$/) { - my $logpath = "$1.log"; - # try to cleanup our backup log file too, if still exisiting, #318 - unlink($logpath) if -e $logpath; + my $id = (defined $ownervm ? "$ownervm@" : '') . $storeid; + my $upid = $rpcenv->fork_worker('imgdel', $id, $authuser, $worker); + my $background_delay = $param->{delay}; + if ($background_delay) { + my $end_time = time() + $background_delay; + my $currently_deleting; # not necessarily true, e.g. sequential api call from cli + do { + my $task = PVE::Tools::upid_decode($upid); + $currently_deleting = PVE::ProcFSTools::check_process_running($task->{pid}, $task->{pstart}); + sleep 1 if $currently_deleting; + } while (time() < $end_time && $currently_deleting); + + if (!$currently_deleting) { + my $status = PVE::Tools::upid_read_status($upid); + return undef if $status eq 'OK'; + die $status; + } } - - return undef; + return $upid; }}); __PACKAGE__->register_method ({ -- 2.39.2