From 9e6929f0dacb598fcf8fb60e88d534f24eabdde6 Mon Sep 17 00:00:00 2001 From: Christian Tellnes Date: Fri, 17 Jul 2015 20:41:43 +0200 Subject: [PATCH] retry confirm errors --- lib/feed.js | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/feed.js b/lib/feed.js index 2b555dd..c39de82 100644 --- a/lib/feed.js +++ b/lib/feed.js @@ -133,27 +133,24 @@ Feed.prototype.confirm = function confirm_feed() { clearTimeout(timeout_id); if(er) - return self.die(er); + return self.confirm_failed(er); var db; try { db = JSON.parse(body) } catch(json_er) { - return self.emit('error', json_er) + return self.confirm_failed(json_er); } if(!self.is_db_updates && !self.dead && (!db.db_name || !db.instance_start_time)) - return self.emit('error', new Error('Bad DB response: ' + body)); + return self.confirm_failed(new Error('Bad DB response: ' + body)); if(self.is_db_updates && !self.dead && !db.couchdb) - return self.emit('error', new Error('Bad server response: ' + body)); + return self.confirm_failed(new Error('Bad server response: ' + body)); if (!self.is_db_updates) self.original_db_seq = db.update_seq - self.log.debug('Confirmed ' + endpoint + ': ' + self.db_safe); - self.emit('confirm', db); - if(self.since == 'now') { self.log.debug('Query since "now" is the same as query since -1') self.since = -1 @@ -164,12 +161,17 @@ Feed.prototype.confirm = function confirm_feed() { self.since = db.update_seq } else if(self.since < 0) { if(isNaN(db.update_seq)) - return self.emit('error', new Error('DB requires specific id in "since"')); + return self.confirm_failed(new Error('DB requires specific id in "since"')); self.log.debug('Query since '+self.since+' will start at ' + (db.update_seq + self.since + 1)) self.since = db.update_seq + self.since + 1 } + self.log.debug('Confirmed ' + endpoint + ': ' + self.db_safe); + self.confirmed = true; + self.retry_fn = self.query; + self.emit('confirm', db); + // If the next change would come after the current update_seq, just fake a catchup event now. if(self.original_db_seq == self.since) { self.caught_up = true @@ -180,6 +182,15 @@ Feed.prototype.confirm = function confirm_feed() { } } +Feed.prototype.confirm_failed = function(err) { + var self = this; + + self.emit('confirm_failed', err); + + self.retry_fn = self.confirm; + self.retry(); +} + Feed.prototype.query = function query_feed() { var self = this; @@ -489,7 +500,7 @@ Feed.prototype.retry = function retry() { self.log.debug('Retry since=' + self.since + ' after ' + self.retry_delay + 'ms ') self.emit('retry', {since:self.since, after:self.retry_delay, db:self.db_safe}); - self.retry_timer = setTimeout(function() { self.query() }, self.retry_delay); + self.retry_timer = setTimeout(function() { self.retry_fn() }, self.retry_delay); var max_retry_ms = self.max_retry_seconds * 1000; self.retry_delay *= 2;