relax trigger delete on specific firing errors (#74)

diff --git a/provider/Logger.js b/provider/Logger.js
index 1ee6ca3..bef4241 100644
--- a/provider/Logger.js
+++ b/provider/Logger.js
@@ -12,7 +12,7 @@
             },
             formatter: function(options) {
                 // Return string will be passed to logger.
-                return '[' + options.timestamp() +'] ['+ options.level.toUpperCase() +'] '+  options.message;
+                return '[' + options.timestamp() +'] ['+ options.level.toUpperCase() +'] [??] [cloudantTrigger] ' + options.message;
             }
         })
     ],
@@ -25,7 +25,7 @@
 
 function getMessage(argsObject) {
     var args = Array.prototype.slice.call(argsObject);
-    args.splice(0, 2);
+    args.shift();
     args.forEach(function(arg, i) {
         if (_.isObject(args[i])) {
             args[i] = JSON.stringify(args[i]);
@@ -36,16 +36,16 @@
 
 // FORMAT: s"[$time] [$category] [$id] [$componentName] [$name] $message"
 module.exports = {
-    info: function(tid, name) {
-        logger.info('['+tid+']', '['+name+']', getMessage(arguments));
+    info: function(name) {
+        logger.info('['+name+']', getMessage(arguments));
     },
-    warn: function(tid, name) {
-        logger.warn('['+tid+']', '['+name+']', getMessage(arguments));
+    warn: function(name) {
+        logger.warn('['+name+']', getMessage(arguments));
     },
-    error: function(tid, name) {
-        logger.error('['+tid+']', '['+name+']', getMessage(arguments));
+    error: function(name) {
+        logger.error('['+name+']', getMessage(arguments));
     },
-    debug: function(tid, name) {
-        logger.debug('['+tid+']', '['+name+']', getMessage(arguments));
+    debug: function(name) {
+        logger.debug('['+name+']', getMessage(arguments));
     }
 };
diff --git a/provider/app.js b/provider/app.js
index c6845cb..0b83a2c 100644
--- a/provider/app.js
+++ b/provider/app.js
@@ -22,15 +22,10 @@
 app.use(bodyParser.urlencoded({ extended: false }));
 app.set('port', process.env.PORT || 8080);
 
-// TODO: Setup a proper Transaction ID
-var tid = "??";
 
 // Whisk API Router Host
 var routerHost = process.env.ROUTER_HOST || 'localhost';
 
-// Support includeDocs=true for triggers who existed before the removal of includeDocs
-var supportIncludeDocs = process.env.SUPPORT_INCLUDE_DOCS || 'false';
-
 // Maximum number of times to retry the invocation of an action
 // before deleting the associated trigger
 var retriesBeforeDelete = constants.RETRIES_BEFORE_DELETE;
@@ -44,7 +39,6 @@
 var dbUsername = process.env.DB_USERNAME;
 var dbPassword = process.env.DB_PASSWORD;
 var dbHost = process.env.DB_HOST;
-var dbPort = process.env.DB_PORT;
 var dbProtocol = process.env.DB_PROTOCOL;
 var dbPrefix = process.env.DB_PREFIX;
 var databaseName = dbPrefix + constants.TRIGGER_DB_SUFFIX;
@@ -53,18 +47,18 @@
 // Create the Provider Server
 var server = http.createServer(app);
 server.listen(app.get('port'), function(){
-    logger.info(tid, 'server.listen', 'Express server listening on port ' + app.get('port'));
+    logger.info('server.listen', 'Express server listening on port ' + app.get('port'));
 });
 
 function createDatabase (nanop) {
-    logger.info(tid, 'createDatabase', 'creating the trigger database');
+    logger.info('createDatabase', 'creating the trigger database');
     return new Promise(function(resolve, reject) {
         nanop.db.create(databaseName, function (err, body) {
             if (!err) {
-                logger.info(tid, databaseName, ' database for triggers was created.');
+                logger.info('createDatabase', 'created trigger database:', databaseName);
             }
             else {
-                logger.info(tid, databaseName, 'failed to create the trigger database.  it might already exist ',err);
+                logger.info('createDatabase', 'failed to create trigger database:', databaseName, err);
             }
             var db = nanop.db.use(databaseName);
             var only_triggers = {
@@ -98,7 +92,7 @@
 }
 
 function createTriggerDb () {
-    logger.info('url is ' +  dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
+    logger.info('createTriggerDb', 'database url is ' +  dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
     var nanop = require('nano')(dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
     if (nanop !== null) {
         return createDatabase (nanop);
@@ -114,20 +108,20 @@
     if (server !== null) {
         var address = server.address();
         if (address === null) {
-            logger.error(tid, 'init', 'Error initializing server. Perhaps port is already in use.');
+            logger.error('init', 'Error initializing server. Perhaps port is already in use.');
             process.exit(-1);
         }
     }
 
     createTriggerDb()
     .then(nanoDb => {
-        logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
+        logger.info('init', 'trigger storage database details:', nanoDb);
 
-        var providerUtils = new ProviderUtils(tid, logger, app, retriesBeforeDelete, nanoDb, routerHost, supportIncludeDocs);
-        var providerRAS = new ProviderRAS(tid, logger, providerUtils);
-        var providerHealth = new ProviderHealth(tid, logger, providerUtils);
-        var providerUpdate = new ProviderUpdate(tid, logger, providerUtils);
-        var providerDelete = new ProviderDelete(tid, logger, providerUtils);
+        var providerUtils = new ProviderUtils(logger, app, retriesBeforeDelete, nanoDb, routerHost);
+        var providerRAS = new ProviderRAS(logger);
+        var providerHealth = new ProviderHealth(logger, providerUtils);
+        var providerUpdate = new ProviderUpdate(logger, providerUtils);
+        var providerDelete = new ProviderDelete(logger, providerUtils);
 
         // RAS Endpoint
         app.get(providerRAS.endPoint, providerRAS.ras);
@@ -144,7 +138,7 @@
         providerUtils.initAllTriggers();
 
     }).catch(err => {
-        logger.error(tid, 'init', 'an error occurred creating database:', err);
+        logger.error('init', 'an error occurred creating database:', err);
     });
 
 }
diff --git a/provider/lib/delete.js b/provider/lib/delete.js
index a7d89a7..330b4f1 100644
--- a/provider/lib/delete.js
+++ b/provider/lib/delete.js
@@ -1,6 +1,6 @@
 var request = require('request');
 
-module.exports = function(tid, logger, utils) {
+module.exports = function(logger, utils) {
 
     // Test Endpoint
     this.endPoint = '/cloudanttriggers/:id';
@@ -9,7 +9,7 @@
     this.delete = function (req, res) {
 
         var method = 'DELETE /cloudanttriggers';
-        logger.info(tid, method);
+        logger.info(method);
 
         var id = req.params.id;
         var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
@@ -34,7 +34,7 @@
             }
              else {
                 var errorMsg = 'Cloudant data trigger ' + id  + ' cannot be deleted.';
-                logger.error(tid, method, errorMsg, error);
+                logger.error(method, errorMsg, error);
                 if (error) {
                     res.status(400).json({
                         message: errorMsg,
diff --git a/provider/lib/health.js b/provider/lib/health.js
index ea417c9..690dc71 100644
--- a/provider/lib/health.js
+++ b/provider/lib/health.js
@@ -1,4 +1,4 @@
-module.exports = function(tid, logger, providerUtils) {
+module.exports = function(logger, providerUtils) {
 
   // Health Endpoint
   this.endPoint = '/health';
diff --git a/provider/lib/update.js b/provider/lib/update.js
index 28c9907..6fca646 100644
--- a/provider/lib/update.js
+++ b/provider/lib/update.js
@@ -1,6 +1,6 @@
 var request = require('request');
 
-module.exports = function(tid, logger, utils) {
+module.exports = function(logger, utils) {
 
     // Test Endpoint
     this.endPoint = '/cloudanttriggers/:id';
@@ -10,16 +10,16 @@
 
         var method = 'PUT /cloudanttriggers';
 
-        logger.info(tid, method);
+        logger.info(method);
         var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
         if (args.maxTriggers > utils.triggersLimit) {
-            logger.warn(tid, method, 'maxTriggers > ' + utils.triggersLimit + ' is not allowed');
+            logger.warn(method, 'maxTriggers > ' + utils.triggersLimit + ' is not allowed');
             res.status(400).json({
                 error: 'maxTriggers > ' + utils.triggersLimit + ' is not allowed'
             });
             return;
         } else if (!args.callback || !args.callback.action || !args.callback.action.name) {
-            logger.warn(tid, method, 'Your callback is unknown for cloudant trigger:', args.callback);
+            logger.warn(method, 'Your callback is unknown for cloudant trigger:', args.callback);
             res.status(400).json({
                 error: 'Your callback is unknown for cloudant trigger.'
             });
@@ -32,7 +32,7 @@
         var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
         var auth = args.apikey.split(':');
 
-        logger.info(tid, method, 'Checking if user has access rights to create a trigger');
+        logger.info(method, 'Checking if user has access rights to create a trigger');
         request({
             method: 'get',
             url: triggerURL,
@@ -43,7 +43,7 @@
         }, function(error, response, body) {
             if (error || response.statusCode >= 400) {
                 var errorMsg = 'Trigger authentication request failed.';
-                logger.error(tid, method, errorMsg, error);
+                logger.error(method, errorMsg, error);
                 if (error) {
                     res.status(400).json({
                         message: errorMsg,
@@ -61,13 +61,13 @@
             else {
                 var id = req.params.id;
                 var trigger = utils.initTrigger(args, id);
-                // 10 is number of retries to create a trigger.
-                utils.createTrigger(trigger, 10)
+                // number of retries to create a trigger.
+                utils.createTrigger(trigger, utils.retriesBeforeDelete)
                 .then(function (newTrigger) {
-                    logger.info(tid, method, 'Trigger was added and database is confirmed.', newTrigger);
+                    logger.info(method, 'Trigger was added and database is confirmed.', newTrigger);
                     utils.addTriggerToDB(newTrigger, res);
                 }, function (err) {
-                    logger.error(tid, method, 'Trigger could not be created.', err);
+                    logger.error(method, 'Trigger could not be created.', err);
                     utils.deleteTrigger(id);
                     res.status(400).json({
                         message: 'Trigger could not be created.',
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 8c5db12..f3f49e7 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -2,35 +2,28 @@
 var request = require('request');
 var constants = require('./constants.js');
 
+
 module.exports = function(
-  tid,
   logger,
   app,
   retriesBeforeDelete,
   triggerDB,
-  routerHost,
-  supportIncludeDocs
+  routerHost
 ) {
 
-    this.tid = tid;
     this.logger = logger;
     this.app = app;
     this.retriesBeforeDelete = retriesBeforeDelete;
     this.triggerDB = triggerDB;
     this.routerHost = routerHost;
 
-    this.logger.info (tid, 'utils', 'received database to store triggers: ' + triggerDB);
-
     // this is the default trigger fire limit (in the event that is was not set during trigger creation)
     this.defaultTriggerFireLimit = constants.DEFAULT_TRIGGER_COUNT;
 
-    // maximum number of times to create a trigger
-    this.retryCount = constants.RETRIES_BEFORE_DELETE;
-
     // Log HTTP Requests
     app.use(function(req, res, next) {
         if (req.url.indexOf('/cloudanttriggers') === 0) {
-            logger.info(tid, 'HttpRequest', req.method, req.url);
+            logger.info('HttpRequest', req.method, req.url);
         }
         next();
     });
@@ -38,9 +31,6 @@
     this.module = 'utils';
     this.triggers = {};
 
-    // we need a way of know if the triggers should fire without max fire constraint (ie fire infinite times)
-    this.unlimitedTriggerFires = false;
-
     var that = this;
 
     // Add a trigger: listen for changes and dispatch.
@@ -74,47 +64,30 @@
             dbURL = dbURL + ':' + dataTrigger.port;
         }
 
-        logger.info(tid, method,'found trigger url: ', dbURL);
+        logger.info(method, 'found trigger url:', dbURL);
         nanoConnection = require('nano')(dbURL);
 
         try {
-
             var triggeredDB = nanoConnection.use(dataTrigger.dbname);
 
-            var includeDocs = false;
-            if (supportIncludeDocs === 'true' && (dataTrigger.includeDoc === true || dataTrigger.includeDoc === 'true')) {
-                includeDocs = true;
-            }
             // Listen for changes on this database.
-            var feed = triggeredDB.follow({since: sinceToUse, include_docs: includeDocs});
+            var feed = triggeredDB.follow({since: sinceToUse, include_docs: false});
 
             dataTrigger.feed = feed;
             that.triggers[dataTrigger.id] = dataTrigger;
 
             feed.on('change', function (change) {
+                logger.info(method, 'Trigger', dataTrigger.id, 'got change from', dataTrigger.dbname, change);
+
                 var triggerHandle = that.triggers[dataTrigger.id];
+                if (triggerHandle) {
+            	    logger.info(method, triggerHandle.triggersLeft, 'triggers left for', dataTrigger.id);
 
-                logger.info(tid, method, 'Got change from', dataTrigger.dbname, change, triggerHandle);
-                logger.info(tid, method, 'Found triggerHandle', triggerHandle);
-
-                if (triggerHandle && triggerHandle.retriesLeft > 0) {
-
-            	    logger.info(tid, method, 'triggers left:', triggerHandle.triggersLeft);
-            	    logger.info(tid, method, 'retries left:', triggerHandle.retriesLeft);
-
-                    if (triggerHandle.triggersLeft === -1) {
-                	    logger.info(tid, method, 'found a trigger fire limit set to -1.  setting it to fire infinitely many times');
-                        that.unlimitedTriggerFires = true;
-                    } else {
-                	    that.unlimitedTriggerFires = false;
-                    }
-
-                    if (that.unlimitedTriggerFires || triggerHandle.triggersLeft > 0) {
+                    if (triggerHandle.maxTriggers === -1 || triggerHandle.triggersLeft > 0) {
                         try {
-                    	    logger.info(tid, method, 'found a valid trigger.  lets fire this trigger', triggerHandle);
                             that.fireTrigger(dataTrigger.id, change);
                         } catch (e) {
-                            logger.error(tid, method, 'Exception occurred in callback', e);
+                            logger.error(method, 'Exception occurred while firing the trigger', e);
                         }
                     }
                 }
@@ -125,22 +98,21 @@
             return new Promise(function(resolve, reject) {
 
             feed.on('error', function (err) {
-                logger.error(tid, method,'Error occurred for trigger', dataTrigger.id, '(db ' + dataTrigger.dbname + '):', err);
-                // revive the feed if an error occured for now
-                // the user should be in charge of removing the feeds
-                logger.info(tid, "attempting to recreate trigger", dataTrigger.id);
+                logger.error(method,'Error occurred for trigger', dataTrigger.id, '(db ' + dataTrigger.dbname + '):', err);
+                // revive the feed if an error occurred for now
                 that.deleteTrigger(dataTrigger.id);
                 dataTrigger.since = "now";
                 if (retryCount > 0) {
+                    logger.info(method, 'attempting to recreate trigger', dataTrigger.id);
+                    logger.info(method, 'Retry Count:', (retryCount - 1));
                     that.createTrigger(dataTrigger, (retryCount - 1))
                     .then(function(trigger) {
-                        logger.error(tid, method, "Retry Count:", (retryCount - 1));
                         resolve(trigger);
                     }, function(err) {
                         reject(err);
                     });
                 } else {
-                    logger.error(tid, method, "Trigger's feed produced too many errors. Deleting the trigger", dataTrigger.id, '(db ' + dataTrigger.dbname + ')');
+                    logger.error(method, "Trigger's feed produced too many errors. Deleting the trigger", dataTrigger.id, '(db ' + dataTrigger.dbname + ')');
                     reject({
                         error: err,
                         message: "Trigger's feed produced too many errors. Deleting the trigger " + dataTrigger.id
@@ -149,14 +121,14 @@
             });
 
             feed.on('confirm', function (dbObj) {
-                logger.info(tid, method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
+                logger.info(method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
                 resolve(dataTrigger);
             });
 
         });
 
         } catch (err) {
-            logger.info('caught an exception: ' + err);
+            logger.info(method, 'caught an exception:', err);
             return Promise.reject(err);
         }
 
@@ -167,23 +139,23 @@
         var method = 'initTrigger';
 
         // validate parameters here
-        logger.info(tid, method, 'create has received the following request args', JSON.stringify(obj));
+        logger.info(method, 'create has received the following request args', JSON.stringify(obj));
 
         // if the trigger creation request has not set the max trigger fire limit
         // we will set it here (default value can be updated in ./constants.js)
         if (!obj.maxTriggers) {
-        	logger.info(tid, method, 'maximum trigger fires has not been set by requester.  setting it to the default value of infinity.');
-        	logger.info(tid, method, 'setting trigger fire limit', that.defaultTriggerFireLimit);
+        	logger.info(method, 'maximum trigger fires has not been set by requester.  setting it to the default value of infinity.');
+        	logger.info(method, 'setting trigger fire limit', that.defaultTriggerFireLimit);
         	obj.maxTriggers = that.defaultTriggerFireLimit;
         } else {
-            logger.info(tid, method, 'maximum trigger fires has been set to:', obj.maxTriggers);
+            logger.info(method, 'maximum trigger fires has been set to:', obj.maxTriggers);
         }
 
         // if we find that includeDoc is set to true we should warn user here
         // (note: this will only be the set for old feeds.  we no longer allow
         // this to be set for newly created feeds).
         if (obj.includeDoc && (obj.includeDoc === true || obj.includeDoc.toString().trim().toLowerCase() === 'true')) {
-            logger.warn(tid, method, 'cloudant trigger feed: includeDoc parameter is no longer supported.');
+            logger.warn(method, 'cloudant trigger feed: includeDoc parameter is no longer supported.');
         }
 
         var trigger = {
@@ -200,8 +172,7 @@
             since: obj.since,
             callback: obj.callback,
             maxTriggers: obj.maxTriggers,
-            triggersLeft: obj.maxTriggers,
-            retriesLeft: retriesBeforeDelete
+            triggersLeft: obj.maxTriggers
         };
 
         return trigger;
@@ -211,7 +182,7 @@
     this.initAllTriggers = function () {
 
         var method = 'initAllTriggers';
-        logger.info(tid, that.module, method, 'Initializing all cloudant triggers from database.');
+        logger.info(method, 'Initializing all cloudant triggers from database.');
 
         triggerDB.view('filters', 'only_triggers', {include_docs: true}, function(err, body) {
             if (!err) {
@@ -223,7 +194,7 @@
                     var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
                     var auth = trigger.doc.apikey.split(':');
 
-                    logger.info(tid, method, "Checking if trigger", trigger.doc.id, "still exists");
+                    logger.info(method, 'Checking if trigger', trigger.doc.id, 'still exists');
                     request({
                         method: 'get',
                         url: triggerURL,
@@ -234,29 +205,29 @@
                     }, function(error, response, body) {
                         //delete from database if trigger no longer exists (404)
                         if (!error && response.statusCode === 404) {
+                            logger.info(method, 'Trigger', trigger.doc.id, 'no longer exists');
                             that.deleteTriggerFromDB(trigger.doc.id);
                         }
                         else {
                             var cloudantTrigger = that.initTrigger(trigger.doc, trigger.doc.id);
 
-                            if (cloudantTrigger.triggersLeft === -1) {
-                                logger.info(tid, method, 'found a trigger fire limit set to -1.  setting it to fire infinitely many times');
-                                that.unlimitedTriggerFires = true;
-                            } else {
-                                that.unlimitedTriggerFires = false;
-                            }
-
                             // check here for triggers left if none left end here, and don't create
-                            if (that.unlimitedTriggerFires || cloudantTrigger.triggersLeft > 0) {
-                                that.createTrigger(cloudantTrigger, that.retryCount);
+                            if (cloudantTrigger.maxTriggers === -1 || cloudantTrigger.triggersLeft > 0) {
+                                that.createTrigger(cloudantTrigger, retriesBeforeDelete)
+                                .then(function (newTrigger) {
+                                    logger.info(method, 'Trigger was added.', newTrigger);
+                                }, function (err) {
+                                    //if feed was not recreated then delete from trigger database
+                                    that.deleteTriggerFromDB(cloudantTrigger.id);
+                                });
                             } else {
-                                logger.info(tid, method, 'found a trigger with no triggers left to fire off.');
+                                logger.info(method, 'found a trigger with no triggers left to fire off.');
                             }
                         }
                     });
                 });
             } else {
-                logger.error(tid, method, 'could not get latest state from database');
+                logger.error(method, 'could not get latest state from database');
             }
         });
 
@@ -267,12 +238,11 @@
         var method = 'deleteTrigger';
         var trigger = that.triggers[id];
         if (trigger) {
-            logger.info(tid, method, 'Stopped cloudant trigger',
-                id, 'listening for changes in database', trigger.dbname);
+            logger.info(method, 'Stopped cloudant trigger', id, 'listening for changes in database', trigger.dbname);
             trigger.feed.stop();
             delete that.triggers[id];
         } else {
-            logger.info(tid, method, 'trigger', id, 'could not be found in the trigger list.');
+            logger.info(method, 'trigger', id, 'could not be found in the trigger list.');
             return false;
         }
     };
@@ -282,7 +252,7 @@
         var method = 'addTriggerToDB';
         triggerDB.insert(_.omit(trigger, 'feed'), trigger.id, function(err, body) {
             if(!err) {
-                logger.info(tid, method, 'trigger', trigger.id, 'was inserted into db.');
+                logger.info(method, 'trigger', trigger.id, 'was inserted into db.');
                 res.status(200).json(_.omit(trigger, 'feed'));
             } else {
                 that.deleteTrigger(trigger.id);
@@ -300,13 +270,13 @@
             if (!err) {
                 triggerDB.destroy(body._id, body._rev, function(err, body) {
                     if (err) {
-                        logger.error(tid, method, 'there was an error while deleting', id, 'from database');
+                        logger.error(method, 'there was an error while deleting', id, 'from database');
                         if (res) {
                             res.status(err.statusCode).json({ error: 'Cloudant data trigger ' + id  + 'cannot be deleted.' } );
                         }
                     } else {
                         that.deleteTrigger(id);
-                        logger.info(tid, method, 'cloudant trigger', id, ' is successfully deleted');
+                        logger.info(method, 'cloudant trigger', id, ' is successfully deleted');
                         if (res) {
                             res.send('Deleted cloudant trigger ' + id);
                         }
@@ -314,13 +284,13 @@
                 });
             } else {
                 if (err.statusCode === 404) {
-                    logger.info(tid, method, 'there was no trigger with id', id, 'in database.', err.error);
+                    logger.info(method, 'there was no trigger with id', id, 'in database.', err.error);
                     if (res) {
-                        res.status(200).json({ message: 'there was no trigger with id ' + id + ' in database.' } );
+                        res.status(404).json({ message: 'there was no trigger with id ' + id + ' in database.' } );
                         res.end();
                     }
                 } else {
-                    logger.error(tid, method, 'there was an error while getting', id, 'from database', err);
+                    logger.error(method, 'there was an error while getting', id, 'from database', err);
                     if (res) {
                         res.status(err.statusCode).json({ error: 'Cloudant data trigger ' + id  + ' cannot be deleted.' } );
                     }
@@ -337,7 +307,6 @@
         var apikey = dataTrigger.apikey;
         var triggerName = dataTrigger.callback.action.name;
         var triggerObj = that.parseQName(triggerName);
-        logger.info(tid, method, 'fireTrigger: change =', change);
 
         var form = change;
         // pass the fire trigger both the change and an object containing
@@ -353,19 +322,11 @@
         }
         form.dbname = dataTrigger.dbname;
 
-        logger.info(tid, method, 'fireTrigger: form =', form);
-        logger.info(tid, method, 'for trigger', id, 'invoking action', triggerName, 'with db update', JSON.stringify(form));
+        logger.info(method, 'firing trigger', triggerName, 'with db update', JSON.stringify(form));
 
         var host = 'https://' + routerHost + ':' + 443;
         var uri = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
         var auth = apikey.split(':');
-        logger.info(tid, method, uri, auth, form);
-
-        // only manage trigger fires if they are not infinite
-        if (!that.unlimitedTriggerFires) {
-      	    logger.info(tid, method, 'found a trigger fire limit set to -1.  setting it to fire infinitely many times');
-            dataTrigger.triggersLeft--;
-        }
 
         request({
             method: 'post',
@@ -377,34 +338,27 @@
             json: form
         }, function(error, response, body) {
             if (dataTrigger) {
-                logger.info(tid, method, 'done http request, STATUS', response ? response.statusCode : response);
-                logger.info(tid, method, 'done http request, body', body);
+                logger.info(method, 'done http request, STATUS', response ? response.statusCode : response);
                 if (error || response.statusCode >= 400) {
-                    dataTrigger.retriesLeft--;
-
-                    // only manage trigger fires if they are not infinite
-                    if (!that.unlimitedTriggerFires) {
-                    	dataTrigger.triggersLeft++; // setting the counter back to where it used to be
+                    logger.error(method, 'there was an error invoking', id, response ? response.statusCode : response, error, body);
+                    if (!error && [408, 429, 500, 503].indexOf(response.statusCode) === -1) {
+                        //delete dead triggers
+                        that.deleteTriggerFromDB(dataTrigger.id);
                     }
-
-                    logger.error(tid, method, 'there was an error invoking', id, response ? response.statusCode : response, error, body);
                 } else {
-                    dataTrigger.retriesLeft = that.retriesBeforeDelete; // reset retry counter
-                    logger.info(tid, method, 'fired', id, 'with body', body, dataTrigger.triggersLeft, 'triggers left');
-                }
+                    // only manage trigger fires if they are not infinite
+                    if (dataTrigger.maxTriggers !== -1) {
+                        dataTrigger.triggersLeft--;
+                    }
+                    logger.info(method, 'fired', id, 'with body', body, dataTrigger.triggersLeft, 'triggers left');
 
-                if (dataTrigger.triggersLeft === 0 || dataTrigger.retriesLeft === 0) {
                     if (dataTrigger.triggersLeft === 0) {
-                        logger.info(tid, 'onTick', 'no more triggers left, deleting');
+                        logger.info('onTick', 'no more triggers left, deleting');
+                        that.deleteTriggerFromDB(dataTrigger.id);
                     }
-                    if (dataTrigger.retriesLeft === 0) {
-                        logger.info(tid, 'onTick', 'too many retries, deleting');
-                    }
-
-                    that.deleteTriggerFromDB(dataTrigger.id);
                 }
             } else {
-                logger.info(tid, method, 'trigger', id, 'was deleted between invocations');
+                logger.info(method, 'trigger', id, 'was deleted between invocations');
             }
         });
     };