prevent race conditions on iscsi asset deletion due to ID re-use
This commit is contained in:
parent
61a4adc6d1
commit
45b502da62
|
|
@ -17,6 +17,7 @@ zfs:
|
|||
# can be used to override defaults if necessary
|
||||
# the example below is useful for TrueNAS 12
|
||||
#cli:
|
||||
# sudoEnabled: true
|
||||
# paths:
|
||||
# zfs: /usr/local/sbin/zfs
|
||||
# zpool: /usr/local/sbin/zpool
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ const FREENAS_ISCSI_EXTENT_ID_PROPERTY_NAME =
|
|||
"democratic-csi:freenas_iscsi_extent_id";
|
||||
const FREENAS_ISCSI_TARGETTOEXTENT_ID_PROPERTY_NAME =
|
||||
"democratic-csi:freenas_iscsi_targettoextent_id";
|
||||
const FREENAS_ISCSI_ASSETS_NAME_PROPERTY_NAME =
|
||||
"democratic-csi:freenas_iscsi_assets_name";
|
||||
|
||||
class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
||||
/**
|
||||
|
|
@ -524,7 +526,7 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
// create target
|
||||
let target = {
|
||||
iscsi_target_name: iscsiName,
|
||||
iscsi_target_alias: "",
|
||||
iscsi_target_alias: "", // TODO: allow template for this
|
||||
};
|
||||
|
||||
response = await httpClient.post("/services/iscsi/target", target);
|
||||
|
|
@ -651,7 +653,7 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
}
|
||||
|
||||
let extent = {
|
||||
iscsi_target_extent_comment: "",
|
||||
iscsi_target_extent_comment: "", // TODO: allow template for this value
|
||||
iscsi_target_extent_type: "Disk", // Disk/File, after save Disk becomes "ZVOL"
|
||||
iscsi_target_extent_name: iscsiName,
|
||||
iscsi_target_extent_insecure_tpc: extentInsecureTpc,
|
||||
|
|
@ -849,7 +851,7 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
});
|
||||
|
||||
let extent = {
|
||||
comment: "",
|
||||
comment: "", // TODO: allow this to be templated
|
||||
type: "DISK", // Disk/File, after save Disk becomes "ZVOL"
|
||||
name: iscsiName,
|
||||
//iscsi_target_extent_naa: "0x3822690834aae6c5",
|
||||
|
|
@ -974,6 +976,11 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
let iqn = basename + ":" + iscsiName;
|
||||
this.ctx.logger.info("FreeNAS iqn: " + iqn);
|
||||
|
||||
// store this off to make delete process more bullet proof
|
||||
await zb.zfs.set(datasetName, {
|
||||
[FREENAS_ISCSI_ASSETS_NAME_PROPERTY_NAME]: iscsiName,
|
||||
});
|
||||
|
||||
// iscsiadm -m discovery -t st -p 172.21.26.81
|
||||
// iscsiadm -m node -T iqn.2011-03.lan.bitness.istgt:test -p bitness.lan -l
|
||||
|
||||
|
|
@ -1151,6 +1158,7 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
FREENAS_ISCSI_TARGET_ID_PROPERTY_NAME,
|
||||
FREENAS_ISCSI_EXTENT_ID_PROPERTY_NAME,
|
||||
FREENAS_ISCSI_TARGETTOEXTENT_ID_PROPERTY_NAME,
|
||||
FREENAS_ISCSI_ASSETS_NAME_PROPERTY_NAME,
|
||||
]);
|
||||
} catch (err) {
|
||||
if (err.toString().includes("dataset does not exist")) {
|
||||
|
|
@ -1164,6 +1172,10 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
|
||||
let targetId = properties[FREENAS_ISCSI_TARGET_ID_PROPERTY_NAME].value;
|
||||
let extentId = properties[FREENAS_ISCSI_EXTENT_ID_PROPERTY_NAME].value;
|
||||
let iscsiName =
|
||||
properties[FREENAS_ISCSI_ASSETS_NAME_PROPERTY_NAME].value;
|
||||
let assetName;
|
||||
let deleteAsset;
|
||||
|
||||
switch (apiVersion) {
|
||||
case 1:
|
||||
|
|
@ -1186,6 +1198,26 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
// assume is gone for now
|
||||
if ([404, 500].includes(response.statusCode)) {
|
||||
} else {
|
||||
deleteAsset = true;
|
||||
assetName = null;
|
||||
|
||||
// checking if set for backwards compatibility
|
||||
if (zb.helpers.isPropertyValueSet(iscsiName)) {
|
||||
switch (apiVersion) {
|
||||
case 1:
|
||||
assetName = response.body.iscsi_target_name;
|
||||
break;
|
||||
case 2:
|
||||
assetName = response.body.name;
|
||||
break;
|
||||
}
|
||||
|
||||
if (assetName != iscsiName) {
|
||||
deleteAsset = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (deleteAsset) {
|
||||
response = await httpClient.delete(endpoint);
|
||||
if (![200, 204].includes(response.statusCode)) {
|
||||
throw new GrpcError(
|
||||
|
|
@ -1195,6 +1227,14 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
} body: ${JSON.stringify(response.body)}`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
this.ctx.logger.debug(
|
||||
"not deleting iscsitarget asset as it appears ID %s has been re-used: zfs name - %s, iscsitarget name - %s",
|
||||
targetId,
|
||||
iscsiName,
|
||||
assetName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// v1 - /services/iscsi/targettoextent/{id}/
|
||||
|
|
@ -1210,6 +1250,26 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
// assume is gone for now
|
||||
if ([404, 500].includes(response.statusCode)) {
|
||||
} else {
|
||||
deleteAsset = true;
|
||||
assetName = null;
|
||||
|
||||
// checking if set for backwards compatibility
|
||||
if (zb.helpers.isPropertyValueSet(iscsiName)) {
|
||||
switch (apiVersion) {
|
||||
case 1:
|
||||
assetName = response.body.iscsi_target_extent_name;
|
||||
break;
|
||||
case 2:
|
||||
assetName = response.body.name;
|
||||
break;
|
||||
}
|
||||
|
||||
if (assetName != iscsiName) {
|
||||
deleteAsset = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (deleteAsset) {
|
||||
response = await httpClient.delete(endpoint);
|
||||
if (![200, 204].includes(response.statusCode)) {
|
||||
throw new GrpcError(
|
||||
|
|
@ -1219,6 +1279,14 @@ class FreeNASDriver extends ControllerZfsSshBaseDriver {
|
|||
} body: ${JSON.stringify(response.body)}`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
this.ctx.logger.debug(
|
||||
"not deleting iscsiextent asset as it appears ID %s has been re-used: zfs name - %s, iscsiextent name - %s",
|
||||
extentId,
|
||||
iscsiName,
|
||||
assetName
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
Loading…
Reference in New Issue