[PATCH v3 pve-storage 3/3] storage: vdisk_free: remove external snapshots

Alexandre Derumier alexandre.derumier at groupe-cyllene.com
Mon Dec 16 10:12:21 CET 2024


Signed-off-by: Alexandre Derumier <alexandre.derumier at groupe-cyllene.com>
---
 src/PVE/Storage.pm                 | 18 +++++++++++++++++-
 src/test/run_test_zfspoolplugin.pl | 18 ++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 3b4f041..798544b 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -1052,7 +1052,23 @@ sub vdisk_free {
 
 	my (undef, undef, undef, undef, undef, $isBase, $format) =
 	    $plugin->parse_volname($volname);
-	$cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase, $format);
+
+        $cleanup_worker = sub {
+	    #remove external snapshots
+	    activate_volumes($cfg, [ $volid ]);
+	    my $snapshots = PVE::Storage::volume_snapshot_info($cfg, $volid);
+	    for my $snapid (sort { $snapshots->{$b}->{order} <=> $snapshots->{$a}->{order} } keys %$snapshots) {
+		my $snap = $snapshots->{$snapid};
+		next if $snapid eq 'current';
+		next if !$snap->{volid};
+		next if !$snap->{ext};
+		my ($snap_storeid, $snap_volname) = parse_volume_id($snap->{volid});
+		my (undef, undef, undef, undef, undef, $snap_isBase, $snap_format) =
+		    $plugin->parse_volname($volname);
+		$plugin->free_image($snap_storeid, $scfg, $snap_volname, $snap_isBase, $snap_format);
+	    }
+	    $plugin->free_image($storeid, $scfg, $volname, $isBase, $format);
+	};
     });
 
     return if !$cleanup_worker;
diff --git a/src/test/run_test_zfspoolplugin.pl b/src/test/run_test_zfspoolplugin.pl
index 095ccb3..4ff9f22 100755
--- a/src/test/run_test_zfspoolplugin.pl
+++ b/src/test/run_test_zfspoolplugin.pl
@@ -6,12 +6,30 @@ use strict;
 use warnings;
 
 use Data::Dumper qw(Dumper);
+use Test::MockModule;
+
 use PVE::Storage;
 use PVE::Cluster;
 use PVE::Tools qw(run_command);
+use PVE::RPCEnvironment;
 use Cwd;
 $Data::Dumper::Sortkeys = 1;
 
+my $rpcenv_module;
+$rpcenv_module = Test::MockModule->new('PVE::RPCEnvironment');
+$rpcenv_module->mock(
+    get_user => sub {
+        return 'root at pam';
+    },
+    fork_worker => sub {
+	my ($self, $dtype, $id, $user, $function, $background) = @_;
+	$function->(123456);
+	return '123456';
+    }
+);
+
+my $rpcenv = PVE::RPCEnvironment->init('pub');
+
 my $verbose = undef;
 
 my $storagename = "zfstank99";
-- 
2.39.5




More information about the pve-devel mailing list