From 1ac273cc48a1c93120a20356c654e7d1cf2631a4 Mon Sep 17 00:00:00 2001 From: Jorge Duarte Rodriguez Date: Sat, 5 Oct 2019 04:58:34 +0200 Subject: [PATCH 1/3] NODE-2147: Proper server topology management. --- lib/sdam/server.js | 10 ++++++---- lib/sdam/topology.js | 8 +++++++- lib/topologies/server.js | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/sdam/server.js b/lib/sdam/server.js index bb0d1bb3f..5a33d7cf8 100644 --- a/lib/sdam/server.js +++ b/lib/sdam/server.js @@ -126,10 +126,12 @@ class Server extends EventEmitter { this.s.pool.on('error', errorEventHandler(this)); this.s.pool.on('parseError', parseErrorEventHandler(this)); - // it is unclear whether consumers should even know about these events - // this.s.pool.on('timeout', timeoutEventHandler(this)); - // this.s.pool.on('reconnect', reconnectEventHandler(this)); - // this.s.pool.on('reconnectFailed', errorEventHandler(this)); + // relay events to ensure consistent topology reconnection/connection status consistency. + // for more details, check: NODE-2147: Unexpected behaviours using useUnifiedTopology: true + + this.s.pool.on('timeout', timeoutEventHandler(this)); + this.s.pool.on('reconnect', reconnectEventHandler(this)); + this.s.pool.on('reconnectFailed', errorEventHandler(this)); // relay all command monitoring events relayEvents(this.s.pool, this, ['commandStarted', 'commandSucceeded', 'commandFailed']); diff --git a/lib/sdam/topology.js b/lib/sdam/topology.js index 5083b61ba..46dda2e09 100644 --- a/lib/sdam/topology.js +++ b/lib/sdam/topology.js @@ -54,7 +54,8 @@ const LOCAL_SERVER_EVENTS = SERVER_RELAY_EVENTS.concat([ 'connect', 'descriptionReceived', 'close', - 'ended' + 'ended', + 'reconnectFailed' ]); /** @@ -843,6 +844,11 @@ function updateServers(topology, incomingServerDescription) { function serverConnectEventHandler(server, topology) { return function(/* isMaster, err */) { + // close topology on reconnectFailed. + server.s.pool.on('reconnectFailed', () => { + topology.close(); + }); + server.monitor({ initial: true, heartbeatFrequencyMS: topology.description.heartbeatFrequencyMS diff --git a/lib/topologies/server.js b/lib/topologies/server.js index 2144e750f..5606880e3 100644 --- a/lib/topologies/server.js +++ b/lib/topologies/server.js @@ -382,7 +382,7 @@ var eventHandler = function(self, event) { event === 'timeout' || event === 'reconnect' || event === 'attemptReconnect' || - 'reconnectFailed' + event === 'reconnectFailed' ) { // Remove server instance from accounting if ( From 3077b2eba6c1f345247d70d7c7d7022ae4112ca1 Mon Sep 17 00:00:00 2001 From: Jorge Duarte Rodriguez Date: Mon, 7 Oct 2019 02:15:14 +0200 Subject: [PATCH 2/3] Add missing functions and fix indenting. --- lib/sdam/server.js | 18 ++++++++++++++++-- lib/sdam/topology.js | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/sdam/server.js b/lib/sdam/server.js index 5a33d7cf8..29ce5b877 100644 --- a/lib/sdam/server.js +++ b/lib/sdam/server.js @@ -126,9 +126,8 @@ class Server extends EventEmitter { this.s.pool.on('error', errorEventHandler(this)); this.s.pool.on('parseError', parseErrorEventHandler(this)); - // relay events to ensure consistent topology reconnection/connection status consistency. + // relay events to ensure topology reconnection/connection status consistency. // for more details, check: NODE-2147: Unexpected behaviours using useUnifiedTopology: true - this.s.pool.on('timeout', timeoutEventHandler(this)); this.s.pool.on('reconnect', reconnectEventHandler(this)); this.s.pool.on('reconnectFailed', errorEventHandler(this)); @@ -391,4 +390,19 @@ function parseErrorEventHandler(server) { }; } +function timeoutEventHandler(server) { + return function() { + server.s.state = STATE_DISCONNECTED; + server.emit('error', new MongoNetworkError('Pool timeout event triggered.')); + server.emit('close'); + }; +} + +function reconnectEventHandler(server) { + return function() { + server.s.state = STATE_CONNECTING; + server.emit('reconnect'); + }; +} + module.exports = Server; diff --git a/lib/sdam/topology.js b/lib/sdam/topology.js index 46dda2e09..eeaeb08ad 100644 --- a/lib/sdam/topology.js +++ b/lib/sdam/topology.js @@ -848,7 +848,7 @@ function serverConnectEventHandler(server, topology) { server.s.pool.on('reconnectFailed', () => { topology.close(); }); - + server.monitor({ initial: true, heartbeatFrequencyMS: topology.description.heartbeatFrequencyMS From dd0ccd544756a389417f19ab3dd65fd9d97dc50c Mon Sep 17 00:00:00 2001 From: Jorge Duarte Rodriguez Date: Mon, 7 Oct 2019 02:31:15 +0200 Subject: [PATCH 3/3] Fix linting. --- lib/sdam/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/sdam/server.js b/lib/sdam/server.js index 29ce5b877..d82808f02 100644 --- a/lib/sdam/server.js +++ b/lib/sdam/server.js @@ -395,7 +395,7 @@ function timeoutEventHandler(server) { server.s.state = STATE_DISCONNECTED; server.emit('error', new MongoNetworkError('Pool timeout event triggered.')); server.emit('close'); - }; + }; } function reconnectEventHandler(server) { @@ -403,6 +403,6 @@ function reconnectEventHandler(server) { server.s.state = STATE_CONNECTING; server.emit('reconnect'); }; -} +} module.exports = Server;