From 196e2f674437aa3d8e37920528746e5683ee8392 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Sat, 12 Mar 2022 21:07:56 -0700 Subject: [PATCH] make target delete more robust during in use scenarios Signed-off-by: Travis Glenn Hansen --- ci/bin/build.sh | 4 ++++ src/driver/freenas/api.js | 19 +++++++++++++++++++ src/utils/iscsi.js | 3 +++ 3 files changed, 26 insertions(+) diff --git a/ci/bin/build.sh b/ci/bin/build.sh index 4e40b21..a2d08d3 100755 --- a/ci/bin/build.sh +++ b/ci/bin/build.sh @@ -4,6 +4,10 @@ set -e set -x export PATH="/usr/local/lib/nodejs/bin:${PATH}" + +node --version +npm --version + # install deps npm i diff --git a/src/driver/freenas/api.js b/src/driver/freenas/api.js index ea9240b..876b431 100644 --- a/src/driver/freenas/api.js +++ b/src/driver/freenas/api.js @@ -1,3 +1,4 @@ +const _ = require("lodash"); const { GrpcError, grpc } = require("../../utils/grpc"); const { CsiBaseDriver } = require("../index"); const HttpClient = require("./http").Client; @@ -1539,7 +1540,25 @@ class FreeNASApiDriver extends CsiBaseDriver { } if (deleteAsset) { + let retries = 0; + let maxRetries = 5; + let retryWait = 1000; response = await httpClient.delete(endpoint); + + // sometimes after an initiator has detached it takes a moment for TrueNAS to settle + // code: 422 body: {\"message\":\"Target csi-ci-55877e95sanity-node-expand-volume-e54f81fa-cd38e798 is in use.\",\"errno\":14} + while ( + response.statusCode == 422 && + retries < maxRetries && + _.get(response, "body.message").includes("Target") && + _.get(response, "body.message").includes("is in use") && + _.get(response, "body.errno") == 14 + ) { + retries++; + await sleep(retryWait); + response = await httpClient.delete(endpoint); + } + if (![200, 204, 404].includes(response.statusCode)) { throw new GrpcError( grpc.status.UNKNOWN, diff --git a/src/utils/iscsi.js b/src/utils/iscsi.js index 00b31dd..a5d8e8d 100644 --- a/src/utils/iscsi.js +++ b/src/utils/iscsi.js @@ -103,7 +103,10 @@ class ISCSI { "-o", "new", ]); + // create DB entry await iscsi.exec(options.paths.iscsiadm, args); + + // update attributes 1 by 1 for (let attribute in attributes) { let args = []; args = args.concat([