[pve-devel] [PATCH storage 1/3] Make the target cache works per target and portal

Daniel Berteaud daniel at firewall-services.com
Wed Sep 25 10:28:35 CEST 2019


When working with several ZFS over iSCSI / LIO storages, we might lookup
between them with less than 15 sec interval.
Previously, the cache of the previous storage was used, which was breaking
disk move for example

Signed-off-by: Daniel Berteaud <daniel at firewall-services.com>
---
 PVE/Storage/LunCmd/LIO.pm | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/PVE/Storage/LunCmd/LIO.pm b/PVE/Storage/LunCmd/LIO.pm
index f246dbb..5f9794d 100644
--- a/PVE/Storage/LunCmd/LIO.pm
+++ b/PVE/Storage/LunCmd/LIO.pm
@@ -145,7 +145,7 @@ my $parser = sub {
 	# find correct TPG
 	foreach my $tpg (@{$target->{tpgs}}) {
 	    if ($tpg->{tag} == $tpg_tag) {
-		$SETTINGS->{target} = $tpg;
+		$SETTINGS->{$scfg->{portal}.$scfg->{target}} = $tpg;
 		$haveTarget = 1;
 		last;
 	    }
@@ -160,16 +160,16 @@ my $parser = sub {
 
 # removes the given lu_name from the local list of luns
 my $free_lu_name = sub {
-    my ($lu_name) = @_;
+    my ($scfg, $lu_name) = @_;
 
     my $new = [];
-    foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+    foreach my $lun (@{$SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns}}) {
 	if ($lun->{storage_object} ne "$BACKSTORE/$lu_name") {
 	    push @$new, $lun;
 	}
     }
 
-    $SETTINGS->{target}->{luns} = $new;
+    $SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns} = $new;
 };
 
 # locally registers a new lun
@@ -181,7 +181,7 @@ my $register_lun = sub {
 	storage_object => "$BACKSTORE/$volname",
 	is_new => 1,
     };
-    push @{$SETTINGS->{target}->{luns}}, $conf;
+    push @{$SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns}}, $conf;
 
     return $conf;
 };
@@ -207,7 +207,7 @@ my $list_view = sub {
     my $object = $params[0];
     my $volname = $extract_volname->($scfg, $params[0]);
 
-    foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+    foreach my $lun (@{$SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns}}) {
 	if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
 	    return $lun->{index};
 	}
@@ -224,7 +224,7 @@ my $list_lun = sub {
     my $object = $params[0];
     my $volname = $extract_volname->($scfg, $params[0]);
 
-    foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+    foreach my $lun (@{$SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns}}) {
 	if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
 	    return $object;
 	}
@@ -289,7 +289,7 @@ my $delete_lun = sub {
     my $path = $params[0];
     my $volname = $extract_volname->($scfg, $params[0]);
 
-    foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+    foreach my $lun (@{$SETTINGS->{$scfg->{portal}.$scfg->{target}}->{luns}}) {
 	next if $lun->{storage_object} ne "$BACKSTORE/$volname";
 
 	# step 1: delete the lun
@@ -310,7 +310,7 @@ my $delete_lun = sub {
 	$execute_remote_command->($scfg, $timeout, $targetcli, 'saveconfig');
 
 	# update interal cache
-	$free_lu_name->($volname);
+	$free_lu_name->($scfg, $volname);
 
 	last;
     }
@@ -352,7 +352,7 @@ sub run_lun_command {
 
     # fetch configuration from target if we haven't yet or if it is stale
     my $timediff = time - $SETTINGS_TIMESTAMP;
-    if (!$SETTINGS || $timediff > $SETTINGS_MAXAGE) {
+    if (!$SETTINGS || !$SETTINGS->{$scfg->{portal}.$scfg->{target}} || $timediff > $SETTINGS_MAXAGE) {
 	$SETTINGS_TIMESTAMP = time;
 	$parser->($scfg);
     }
-- 
2.21.0





More information about the pve-devel mailing list