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) {
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
// v1 = 204
@ -1483,7 +1503,27 @@ class FreeNASApiDriver extends CsiBaseDriver {
});
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
// v1 = 204

View File

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

View File

@ -1450,7 +1450,27 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
});
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
// v1 = 204
@ -1532,7 +1552,27 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
});
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
// 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
// that falls out of the range of 2xx
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) {
// The request was made but no response was received
// `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 logerrors = _.get(options, "logerrors", false);
let retryCondition = options.retryCondition;
let executeStartTime;
do {
current_try++;
try {
executeStartTime = Date.now();
return await code();
} catch (err) {
if (current_try >= retries) {
@ -202,6 +214,16 @@ async function retry(retries, retriesDelay, code, options = {}) {
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;
if (_.get(options, "exponential", false) === true) {
sleep_time = retriesDelay * current_try;