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