From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 89DDC6CFCE for ; Thu, 12 Aug 2021 13:01:58 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 80C7B22059 for ; Thu, 12 Aug 2021 13:01:28 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 5D10821FCD for ; Thu, 12 Aug 2021 13:01:24 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 4627043306 for ; Thu, 12 Aug 2021 13:01:17 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Thu, 12 Aug 2021 13:01:00 +0200 Message-Id: <20210812110111.73883-2-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210812110111.73883-1-f.ebner@proxmox.com> References: <20210812110111.73883-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.417 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH v3 storage 1/3] zfspool: add zfs_get_sorted_snapshot_list helper X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Aug 2021 11:01:58 -0000 replacing the current zfs_get_latest_snapshot. For volume_snapshot_list, ignore errors as before. Signed-off-by: Fabian Ebner --- PVE/Storage/ZFSPoolPlugin.pm | 44 +++++++++++------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index c4be70f..c2a0385 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -395,25 +395,21 @@ sub zfs_list_zvol { return $list; } -sub zfs_get_latest_snapshot { - my ($class, $scfg, $volname) = @_; +sub zfs_get_sorted_snapshot_list { + my ($class, $scfg, $volname, $sort_params) = @_; my $vname = ($class->parse_volname($volname))[1]; - # abort rollback if snapshot is not the latest - my @params = ('-t', 'snapshot', '-o', 'name', '-s', 'creation'); + my @params = ('-H', '-t', 'snapshot', '-o', 'name', $sort_params->@*, "$scfg->{pool}\/$vname"); my $text = $class->zfs_request($scfg, undef, 'list', @params); my @snapshots = split(/\n/, $text); - my $recentsnap; - foreach (@snapshots) { - if (/$scfg->{pool}\/$vname/) { - s/^.*@//; - $recentsnap = $_; - } + my $snap_names = []; + for my $snapshot (@snapshots) { + (my $snap_name = $snapshot) =~ s/^.*@//; + push $snap_names->@*, $snap_name; } - - return $recentsnap; + return $snap_names; } sub status { @@ -486,7 +482,10 @@ sub volume_snapshot_rollback { sub volume_rollback_is_possible { my ($class, $scfg, $storeid, $volname, $snap) = @_; - my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname); + # can't use '-S creation', because zfs list won't reverse the order when the + # creation time is the same second, breaking at least our tests. + my $snapshots = $class->zfs_get_sorted_snapshot_list($scfg, $volname, ['-s', 'creation']); + my $recentsnap = $snapshots->[-1]; die "can't rollback, no snapshots exist at all\n" if !defined($recentsnap); @@ -500,26 +499,9 @@ sub volume_rollback_is_possible { sub volume_snapshot_list { my ($class, $scfg, $storeid, $volname) = @_; - my ($vtype, $name, $vmid) = $class->parse_volname($volname); - - my $zpath = "$scfg->{pool}/$name"; - my $snaps = []; - - my $cmd = ['zfs', 'list', '-r', '-H', '-S', 'name', '-t', 'snap', '-o', - 'name', $zpath]; - - my $outfunc = sub { - my $line = shift; - - if ($line =~ m/^\Q$zpath\E@(.*)$/) { - push @$snaps, $1; - } - }; - - eval { run_command( [$cmd], outfunc => $outfunc , errfunc => sub{}); }; - # return an empty array if dataset does not exist. + eval { $snaps = $class->zfs_get_sorted_snapshot_list($scfg, $volname, ['-S', 'name']); }; return $snaps; } -- 2.30.2