UNPKG

elasticsearch

Version:

The official low-level Elasticsearch client for Node.js and the browser.

59 lines (48 loc) 1.85 kB
var utils = require('../utils'); /** * Patch the transport's connection pool to schedule a sniff after a connection fails. * When a connection fails for the first time it will schedule a sniff 1 second in the * future, and increase the timeout based on the deadTimeout algorithm chosen by the * connectionPool, and the number of times the sniff has failed. * * @param {Transport} transport - the transport that will be using this behavior * @return {undefined} */ module.exports = function setupSniffOnConnectionFault(transport) { var failures = 0; var pool = transport.connectionPool; var originalOnDied = pool._onConnectionDied; // do the actual sniff, if the sniff is unable to // connect to a node this function will be called again by the connectionPool var work = function() { work.timerId = transport._timeout(work.timerId); transport.sniff(); }; // create a function that will count down to a // point n milliseconds into the future var countdownTo = function(ms) { var start = utils.now(); return function() { return start - ms; }; }; // overwrite the function, but still call it pool._onConnectionDied = function(connection, wasAlreadyDead) { var ret = originalOnDied.call(pool, connection, wasAlreadyDead); // clear the failures if this is the first failure we have seen failures = work.timerId ? failures + 1 : 0; var ms = pool.calcDeadTimeout(failures, 1000); if (work.timerId && ms < work.timerId && work.countdown()) { // clear the timer work.timerId = transport._timeout(work.timerId); } if (!work.timerId) { work.timerId = transport._timeout(work, ms); work.countdown = countdownTo(ms); } return ret; }; pool._onConnectionDied.restore = function() { pool._onConnectionDied = originalOnDied; }; };