[pve-devel] [PATCH 06/09] Refactored code according to suggestions by Alexandre. Also fixed bug so that parent to an image is returned.

mir at datanom.net mir at datanom.net
Mon Aug 12 20:09:11 CEST 2013


From: Michael Rasmussen <mir at datanom.net>

The fix solves timeout problems in pve GUI since refactored code runs 5
times faster than original code.

Signed-off-by: Michael Rasmussen <mir at datanom.net>
---
 PVE/Storage/ZFSPlugin.pm | 70 ++++++++++++++++++++++++------------------------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index ff32b97..0ec6632 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -96,22 +96,6 @@ sub zfs_parse_size {
     }
 }
 
-sub zfs_get_zvol_props {
-    my ($scfg, $zvol) = @_;
-    my $props = {};
-
-    my $text = zfs_request($scfg, 'get', '-H', 'all', $zvol);
-
-    my @lines = split /\n/, $text;
-    foreach my $line (@lines) {
-	if ($line =~ /^(.+)\s+(.+)\s+(.+)\s+(.+)$/) {
-            $props->{$2} = $3;
-        }
-    }
-    
-    return $props;
-}
-
 sub zfs_get_pool_stats {
 	my ($scfg) = @_;
 	my $map = {
@@ -133,23 +117,36 @@ sub zfs_get_pool_stats {
 
 sub zfs_parse_zvol_list {
     my ($text) = @_;
-    my @list = ();
-    my @zvols;
-
-    return \@list if !$text;
+	my $list = ();
+	
+    return $list if !$text;
 
     my @lines = split /\n/, $text;
     foreach my $line (@lines) {
-		@zvols = split /\//, $line;
-		my $pool = $zvols[0];
-		if (scalar(@zvols) == 2 && $zvols[0] !~ /^rpool$/) {
-		    my $disk = $zvols[1];
-		    next unless $disk =~ m!^(\w+)-(\d+)-(\w+)-(\d+)$!;
-		    push (@list, $pool . '/' . $disk);
+		if ($line =~ /^(.+)\s+([a-zA-Z0-9\.]+|\-)\s+(.+)$/) {
+			my $zvol = {};
+			my $name;
+			my $disk;
+			my @zvols = split /\//, $1;
+			my $pool = $zvols[0];
+			if (scalar(@zvols) == 2 && $zvols[0] !~ /^rpool$/) {
+				$disk = $zvols[1];
+				next unless $disk =~ m!^(\w+)-(\d+)-(\w+)-(\d+)$!;
+				$name = $pool . '/' . $disk;
+			}
+			else {
+				next;
+			}
+			$zvol->{name} = $name;
+			$zvol->{size} = zfs_parse_size($2);
+			if ($3 !~ /^-$/) {
+				$zvol->{origin} = $3;
+			}
+			push @$list, $zvol;
 		}
-    }
-
-    return \@list;
+	}
+	
+	return $list;
 }
 
 sub zfs_parse_lu_list {
@@ -264,13 +261,13 @@ sub zfs_delete_zvol {
 sub zfs_list_zvol {
     my ($scfg) = @_;
 
-    my $text = zfs_request($scfg, 'list', '-o', 'name', '-Hr');
+    my $text = zfs_request($scfg, 'list', '-o', 'name,volsize,origin', '-Hr');
     my $zvols = zfs_parse_zvol_list($text);
     return undef if !$zvols;
 
     my $list = {};
     foreach my $zvol (@$zvols) {
-		my @values = split('/', $zvol);
+		my @values = split('/', $zvol->{name});
 
 		my $pool = $values[0];
 		my $image = $values[1];
@@ -278,16 +275,19 @@ sub zfs_list_zvol {
 		if ($image =~ m/^((vm|base)-(\d+)-\S+)$/) {
 			$owner = $3;
 		}
+		else {
+			next;
+		}
 
-		my $props = zfs_get_zvol_props($scfg, $zvol);
-		my $parent = $props->{origin};
-		if($parent && $parent =~ m/^$scfg->{pool}\/(\S+)$/){
+		my $parent = $zvol->{origin};
+		if($zvol->{origin} && $zvol->{origin} =~ m/^$scfg->{pool}\/(\S+)$/){
 			$parent = $1;
 		}
 
 		$list->{$pool}->{$image} = {
 			name => $image,
-			size => zfs_get_zvol_size($scfg, $image),
+			size => $zvol->{size},
+			parent => $parent,
 			format => 'raw',
 			vmid => $owner
 		};
-- 
1.8.4.rc2




More information about the pve-devel mailing list