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@firewall-services.com>
+# Return settings of a specific target
+my $get_target_settings = sub {
+ my ($scfg) = @_;
+
+ my $id = "$scfg->{portal}.$scfg->{target}";
+ return undef if !$SETTINGS;
+ return $SETTINGS->{$id};
+};
+
# fetches and parses targetcli config from the portal
my $parser = sub {
my ($scfg) = @_;
# fetches and parses targetcli config from the portal
my $parser = sub {
my ($scfg) = @_;
# find correct TPG
foreach my $tpg (@{$target->{tpgs}}) {
if ($tpg->{tag} == $tpg_tag) {
# find correct TPG
foreach my $tpg (@{$target->{tpgs}}) {
if ($tpg->{tag} == $tpg_tag) {
- $SETTINGS->{target} = $tpg;
+ my $id = "$scfg->{portal}.$scfg->{target}";
+ $SETTINGS->{$id} = $tpg;
# removes the given lu_name from the local list of luns
my $free_lu_name = sub {
# removes the given lu_name from the local list of luns
my $free_lu_name = sub {
+ my ($scfg, $lu_name) = @_;
- foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+ my $target = $get_target_settings->($scfg);
+ foreach my $lun (@{$target->{luns}}) {
if ($lun->{storage_object} ne "$BACKSTORE/$lu_name") {
push @$new, $lun;
}
}
if ($lun->{storage_object} ne "$BACKSTORE/$lu_name") {
push @$new, $lun;
}
}
- $SETTINGS->{target}->{luns} = $new;
+ $target->{luns} = $new;
};
# locally registers a new lun
};
# locally registers a new lun
storage_object => "$BACKSTORE/$volname",
is_new => 1,
};
storage_object => "$BACKSTORE/$volname",
is_new => 1,
};
- push @{$SETTINGS->{target}->{luns}}, $conf;
+ my $target = $get_target_settings->($scfg);
+ push @{$target->{luns}}, $conf;
my $object = $params[0];
my $volname = $extract_volname->($scfg, $object);
my $object = $params[0];
my $volname = $extract_volname->($scfg, $object);
+ my $target = $get_target_settings->($scfg);
return undef if !defined($volname); # nothing to search for..
return undef if !defined($volname); # nothing to search for..
- foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+ foreach my $lun (@{$target->{luns}}) {
if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
return $lun->{index};
}
if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
return $lun->{index};
}
my $object = $params[0];
my $volname = $extract_volname->($scfg, $params[0]);
my $object = $params[0];
my $volname = $extract_volname->($scfg, $params[0]);
+ my $target = $get_target_settings->($scfg);
- foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+ foreach my $lun (@{$target->{luns}}) {
if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
return $object;
}
if ($lun->{storage_object} eq "$BACKSTORE/$volname") {
return $object;
}
my $path = $params[0];
my $volname = $extract_volname->($scfg, $params[0]);
my $path = $params[0];
my $volname = $extract_volname->($scfg, $params[0]);
+ my $target = $get_target_settings->($scfg);
- foreach my $lun (@{$SETTINGS->{target}->{luns}}) {
+ foreach my $lun (@{$target->{luns}}) {
next if $lun->{storage_object} ne "$BACKSTORE/$volname";
# step 1: delete the lun
next if $lun->{storage_object} ne "$BACKSTORE/$volname";
# step 1: delete the lun
$execute_remote_command->($scfg, $timeout, $targetcli, 'saveconfig');
# update interal cache
$execute_remote_command->($scfg, $timeout, $targetcli, 'saveconfig');
# update interal cache
- $free_lu_name->($volname);
+ $free_lu_name->($scfg, $volname);
# fetch configuration from target if we haven't yet or if it is stale
my $timediff = time - $SETTINGS_TIMESTAMP;
# fetch configuration from target if we haven't yet or if it is stale
my $timediff = time - $SETTINGS_TIMESTAMP;
- if (!$SETTINGS || $timediff > $SETTINGS_MAXAGE) {
+ my $target = $get_target_settings->($scfg);
+ if (!$target || $timediff > $SETTINGS_MAXAGE) {
$SETTINGS_TIMESTAMP = time;
$parser->($scfg);
}
$SETTINGS_TIMESTAMP = time;
$parser->($scfg);
}