more complete usage of retry logic

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2022-05-07 18:10:08 -06:00
parent 2032c67be0
commit 466845cbd9
4 changed files with 113 additions and 5 deletions

View File

@ -1402,7 +1402,27 @@ class FreeNASApiDriver extends CsiBaseDriver {
}); });
if (deleteAsset) { if (deleteAsset) {
response = await httpClient.delete(endpoint); response = await GeneralUtils.retry(
3,
1000,
async () => {
return await httpClient.delete(endpoint);
},
{
retryCondition: (err) => {
if (err.code == "ECONNRESET") {
return true;
}
if (err.code == "ECONNABORTED") {
return true;
}
if (err.response && err.response.statusCode == 504) {
return true;
}
return false;
},
}
);
// returns a 500 if does not exist // returns a 500 if does not exist
// v1 = 204 // v1 = 204
@ -1483,7 +1503,27 @@ class FreeNASApiDriver extends CsiBaseDriver {
}); });
if (deleteAsset) { if (deleteAsset) {
response = await httpClient.delete(endpoint); response = await GeneralUtils.retry(
3,
1000,
async () => {
return await httpClient.delete(endpoint);
},
{
retryCondition: (err) => {
if (err.code == "ECONNRESET") {
return true;
}
if (err.code == "ECONNABORTED") {
return true;
}
if (err.response && err.response.statusCode == 504) {
return true;
}
return false;
},
}
);
// returns a 500 if does not exist // returns a 500 if does not exist
// v1 = 204 // v1 = 204

View File

@ -86,6 +86,12 @@ class Client {
httpAgent: this.getHttpAgent(), httpAgent: this.getHttpAgent(),
httpsAgent: this.getHttpsAgent(), httpsAgent: this.getHttpsAgent(),
timeout: 60 * 1000, timeout: 60 * 1000,
validateStatus: function (status) {
if (status >= 500) {
return false;
}
return true;
},
}; };
if (client.options.apiKey) { if (client.options.apiKey) {

View File

@ -1450,7 +1450,27 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
}); });
if (deleteAsset) { if (deleteAsset) {
response = await httpClient.delete(endpoint); response = await GeneralUtils.retry(
3,
1000,
async () => {
return await httpClient.delete(endpoint);
},
{
retryCondition: (err) => {
if (err.code == "ECONNRESET") {
return true;
}
if (err.code == "ECONNABORTED") {
return true;
}
if (err.response && err.response.statusCode == 504) {
return true;
}
return false;
},
}
);
// returns a 500 if does not exist // returns a 500 if does not exist
// v1 = 204 // v1 = 204
@ -1532,7 +1552,27 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
}); });
if (deleteAsset) { if (deleteAsset) {
response = await httpClient.delete(endpoint); response = await GeneralUtils.retry(
3,
1000,
async () => {
return await httpClient.delete(endpoint);
},
{
retryCondition: (err) => {
if (err.code == "ECONNRESET") {
return true;
}
if (err.code == "ECONNABORTED") {
return true;
}
if (err.response && err.response.statusCode == 504) {
return true;
}
return false;
},
}
);
// returns a 500 if does not exist // returns a 500 if does not exist
// v1 = 204 // v1 = 204

View File

@ -140,7 +140,16 @@ function axios_request(options, callback = function () {}) {
// The request was made and the server responded with a status code // The request was made and the server responded with a status code
// that falls out of the range of 2xx // that falls out of the range of 2xx
let res = prep_response(err.response); let res = prep_response(err.response);
callback(null, res, res.body); let senderr = false;
if (
options.validateStatus &&
typeof options.validateStatus == "function"
) {
if (!options.validateStatus(res.statusCode)) {
senderr = true;
}
}
callback(senderr ? err : null, res, res.body);
} else if (err.request) { } else if (err.request) {
// The request was made but no response was received // The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
@ -183,9 +192,12 @@ async function retry(retries, retriesDelay, code, options = {}) {
let maxwait = _.get(options, "maxwait"); let maxwait = _.get(options, "maxwait");
let logerrors = _.get(options, "logerrors", false); let logerrors = _.get(options, "logerrors", false);
let retryCondition = options.retryCondition; let retryCondition = options.retryCondition;
let executeStartTime;
do { do {
current_try++; current_try++;
try { try {
executeStartTime = Date.now();
return await code(); return await code();
} catch (err) { } catch (err) {
if (current_try >= retries) { if (current_try >= retries) {
@ -202,6 +214,16 @@ async function retry(retries, retriesDelay, code, options = {}) {
console.log(`retry - err:`, err); console.log(`retry - err:`, err);
} }
} }
// handle minExecutionTime
if (options.minExecutionTime > 0) {
let minDelayTime =
options.minExecutionTime - (Date.now() - executeStartTime);
if (minDelayTime > 0) {
await sleep(minDelayTime);
}
}
// handle delay
let sleep_time = retriesDelay; let sleep_time = retriesDelay;
if (_.get(options, "exponential", false) === true) { if (_.get(options, "exponential", false) === true) {
sleep_time = retriesDelay * current_try; sleep_time = retriesDelay * current_try;