diff --git a/index.js b/index.js index 4135dc1..3b5ee8f 100644 --- a/index.js +++ b/index.js @@ -51,11 +51,14 @@ function RedisClient(stream, options) { if (options.connect_timeout && !isNaN(options.connect_timeout) && options.connect_timeout > 0) { this.connect_timeout = +options.connect_timeout; } - this.enable_offline_queue = true; if (typeof this.options.enable_offline_queue === "boolean") { this.enable_offline_queue = this.options.enable_offline_queue; } + this.retry_max_delay = null; + if (options.retry_max_delay !== undefined && !isNaN(options.retry_max_delay) && options.retry_max_delay > 0) { + this.retry_max_delay = options.retry_max_delay; + } this.initialize_retry_vars(); this.pub_sub_mode = false; @@ -429,7 +432,11 @@ RedisClient.prototype.connection_gone = function (why) { return; } - this.retry_delay = Math.floor(this.retry_delay * this.retry_backoff); + if (this.retry_max_delay !== null && this.retry_delay > this.retry_max_delay) { + this.retry_delay = this.retry_max_delay; + } else { + this.retry_delay = Math.floor(this.retry_delay * this.retry_backoff); + } if (exports.debug_mode) { console.log("Retry connection in " + this.retry_delay + " ms"); diff --git a/test.js b/test.js index b790f5f..12947e2 100644 --- a/test.js +++ b/test.js @@ -1798,6 +1798,28 @@ tests.auth = function () { }); }; +tests.reconnectRetryMaxDelay = function() { + var time = new Date().getTime(), + name = 'reconnectRetryMaxDelay', + reconnecting = false; + var client = redis.createClient(PORT, HOST, { + retry_max_delay: 1 + }); + client.on('ready', function() { + if (!reconnecting) { + reconnecting = true; + client.retry_delay = 1000; + client.retry_backoff = 1; + client.stream.end(); + } else { + client.end(); + var lasted = new Date().getTime() - time; + assert.ok(lasted < 1000); + next(name); + } + }); +}; + all_tests = Object.keys(tests); all_start = new Date(); test_count = 0;