From fc1a7750a7e904743a2b5dd508095a33baf01cd5 Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Wed, 5 Feb 2020 18:01:25 -0500 Subject: [PATCH] refactor: errors before handshake should mark server unknown --- lib/core/sdam/server.js | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/core/sdam/server.js b/lib/core/sdam/server.js index d60082a525..1c4aeeda79 100644 --- a/lib/core/sdam/server.js +++ b/lib/core/sdam/server.js @@ -279,7 +279,11 @@ class Server extends EventEmitter { } this.s.pool.withConnection((err, conn, cb) => { - if (err) return cb(err); + if (err) { + markServerUnknown(this, err); + return cb(err); + } + conn.command(ns, cmd, options, makeOperationHandler(this, options, cb)); }, callback); } @@ -299,7 +303,11 @@ class Server extends EventEmitter { } this.s.pool.withConnection((err, conn, cb) => { - if (err) return cb(err); + if (err) { + markServerUnknown(this, err); + return cb(err); + } + conn.query(ns, cmd, cursorState, options, makeOperationHandler(this, options, cb)); }, callback); } @@ -319,7 +327,11 @@ class Server extends EventEmitter { } this.s.pool.withConnection((err, conn, cb) => { - if (err) return cb(err); + if (err) { + markServerUnknown(this, err); + return cb(err); + } + conn.getMore(ns, cursorState, batchSize, options, makeOperationHandler(this, options, cb)); }, callback); } @@ -341,7 +353,11 @@ class Server extends EventEmitter { } this.s.pool.withConnection((err, conn, cb) => { - if (err) return cb(err); + if (err) { + markServerUnknown(this, err); + return cb(err); + } + conn.killCursors(ns, cursorState, makeOperationHandler(this, null, cb)); }, callback); } @@ -436,11 +452,22 @@ function executeWriteOperation(args, options, callback) { } server.s.pool.withConnection((err, conn, cb) => { - if (err) return cb(err); + if (err) { + markServerUnknown(server, err); + return cb(err); + } + conn[op](ns, ops, options, makeOperationHandler(server, options, cb)); }, callback); } +function markServerUnknown(server, error) { + server.emit( + 'descriptionReceived', + new ServerDescription(server.description.address, null, { error }) + ); +} + function makeOperationHandler(server, options, callback) { return function handleOperationResult(err, result) { if (err) {