disable a throttled alarms trigger if retries exhausted (#136)
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 75125d8..ba38adf 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -79,7 +79,7 @@
});
};
- this.postTrigger = function(dataTrigger, auth, retryCount) {
+ this.postTrigger = function(dataTrigger, auth, retryCount, throttleCount) {
var method = 'postTrigger';
return new Promise(function(resolve, reject) {
@@ -103,11 +103,14 @@
logger.info(method, triggerIdentifier, 'http post request, STATUS:', response ? response.statusCode : undefined);
if (error || response.statusCode >= 400) {
+ logger.error(method, 'there was an error invoking', triggerIdentifier, response ? response.statusCode : error);
+ var throttleCounter = throttleCount || 0;
+
// only manage trigger fires if they are not infinite
if (dataTrigger.maxTriggers && dataTrigger.maxTriggers !== -1) {
dataTrigger.triggersLeft++;
}
- logger.error(method, 'there was an error invoking', triggerIdentifier, response ? response.statusCode : error);
+
if (!error && utils.shouldDisableTrigger(response.statusCode)) {
//disable trigger
var message = 'Automatically disabled after receiving a ' + response.statusCode + ' status code when firing the trigger';
@@ -116,18 +119,26 @@
}
else {
if (retryCount < retryAttempts) {
+ throttleCounter = response && response.statusCode === HttpStatus.TOO_MANY_REQUESTS ? throttleCounter + 1 : throttleCounter;
logger.info(method, 'attempting to fire trigger again', triggerIdentifier, 'Retry Count:', (retryCount + 1));
setTimeout(function () {
- utils.postTrigger(dataTrigger, auth, (retryCount + 1))
+ utils.postTrigger(dataTrigger, auth, (retryCount + 1), throttleCounter)
.then(triggerId => {
resolve(triggerId);
})
.catch(err => {
reject(err);
});
- }, retryDelay);
+ }, Math.max(retryDelay, 1000 * Math.pow(throttleCounter, 2)));
} else {
- reject('Unable to reach server to fire trigger ' + triggerIdentifier);
+ if (throttleCounter === retryAttempts) {
+ var msg = 'Automatically disabled after continuously receiving a 429 status code when firing the trigger';
+ utils.disableTrigger(triggerIdentifier, 429, msg);
+ reject('Disabled trigger ' + triggerIdentifier + ' due to status code: 429');
+ }
+ else {
+ reject('Unable to reach server to fire trigger ' + triggerIdentifier);
+ }
}
}
} else {