Skip to content

Commit ab55fd9

Browse files
committed
fixed; socketOptions shared between all servers
Instead of sharing the socketOptions object (and host/port) between replset servers we now create seperate objects. The only reason this issue didnt outright break anything earlier was due to the ConnectionPool being started within the same tick as its construction (luck).
1 parent d0b5bf2 commit ab55fd9

File tree

2 files changed

+55
-32
lines changed

2 files changed

+55
-32
lines changed

lib/mongodb/connection/repl_set.js

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ var Connection = require('./connection').Connection,
55
debug = require('util').debug,
66
inherits = require('util').inherits,
77
inspect = require('util').inspect,
8-
utils = require('../utils'),
98
Server = require('./server').Server,
109
PingStrategy = require('./strategies/ping_strategy').PingStrategy,
1110
StatisticsStrategy = require('./strategies/statistics_strategy').StatisticsStrategy,
@@ -727,7 +726,9 @@ ReplSet.prototype.connect = function(parent, options, callback) {
727726
this._state = new ReplSet.State();
728727

729728
// Ensure parent can do a slave query if it's set
730-
parent.slaveOk = this.slaveOk ? this.slaveOk : parent.slaveOk;
729+
parent.slaveOk = this.slaveOk
730+
? this.slaveOk
731+
: parent.slaveOk;
731732

732733
// Remove any listeners
733734
this.removeAllListeners("fullsetup");
@@ -760,48 +761,32 @@ ReplSet.prototype.connect = function(parent, options, callback) {
760761
// Get server addresses
761762
var addresses = this._state.addresses;
762763

763-
// Default empty socket options object
764-
var socketOptions = {};
765-
766-
// Set fast connect timeout
767-
socketOptions['connectTimeoutMS'] = this._connectTimeoutMS;
768-
769-
// If ssl is specified
770-
if(this.ssl)
771-
socketOptions.ssl = true;
772-
773-
// If a socket option object exists clone it
774-
if(utils.isObject(this.socketOptions)) {
775-
var keys = Object.keys(this.socketOptions);
776-
for(var j = 0; j < keys.length; j++)
777-
socketOptions[keys[j]] = this.socketOptions[keys[j]];
778-
}
779-
780764
// De-duplicate any servers
781-
var server;
765+
var server, key;
782766
for(var i = 0; i < this.servers.length; i++) {
783767
server = this.servers[i];
784-
// Add host information to socket options
785-
socketOptions['host'] = server.host;
786-
socketOptions['port'] = server.port;
787-
server.socketOptions = socketOptions;
788-
server.replicasetInstance = this;
789-
server.enableRecordQueryStats(this.recordQueryStats);
790-
// If server does not exist set it
791-
if(addresses[server.host + ":" + server.port] == null) {
792-
addresses[server.host + ":" + server.port] = server;
768+
key = server.host + ":" + server.port;
769+
if(null == addresses[key]) {
770+
addresses[key] = server;
793771
}
794772
}
795773

796774
// Get the list of servers that is deduplicated and start connecting
797775
var candidateServers = [];
798776
var keys = Object.keys(addresses);
799777
for(var i = 0; i < keys.length; i++) {
800-
candidateServers.push(addresses[keys[i]]);
778+
server = addresses[keys[i]];
779+
server.assignReplicaSet(this);
780+
candidateServers.push(server);
801781
}
782+
802783
// Let's connect to the first one on the list
803784
server = candidateServers.pop();
804-
server.connect(parent, {returnIsMasterResults: true, eventReceiver:server}, _connectHandler(this, candidateServers, server));
785+
var opts = {
786+
returnIsMasterResults: true,
787+
eventReceiver: server
788+
}
789+
server.connect(parent, opts, _connectHandler(this, candidateServers, server));
805790
}
806791

807792
/**

lib/mongodb/connection/server.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var Connection = require('./connection').Connection,
55
ConnectionPool = require('./connection_pool').ConnectionPool,
66
EventEmitter = require('events').EventEmitter,
77
Base = require('./base').Base,
8+
utils = require('../utils'),
89
inherits = require('util').inherits;
910

1011
/**
@@ -50,6 +51,7 @@ function Server(host, port, options) {
5051
this.ssl = this.options.ssl == null ? false : this.options.ssl;
5152
this.slaveOk = this.options["slave_ok"];
5253
this._used = false;
54+
this.replicasetInstance = null;
5355

5456
// Get the readPreference
5557
var readPreference = this.options['readPreference'];
@@ -165,10 +167,46 @@ Server.prototype.allServerInstances = function() {
165167
* @ignore
166168
*/
167169
Server.prototype.isSetMember = function() {
168-
return this['replicasetInstance'] != null || this['mongosInstance'] != null;
170+
return this.replicasetInstance != null || this.mongosInstance != null;
169171
}
170172

171173
/**
174+
* Assigns a replica set to this `server`.
175+
*
176+
* @param {ReplSet} replset
177+
* @ignore
178+
*/
179+
Server.prototype.assignReplicaSet = function (replset) {
180+
this.replicasetInstance = replset;
181+
this.inheritReplSetOptionsFrom(replset);
182+
this.enableRecordQueryStats(replset.recordQueryStats);
183+
}
184+
185+
/**
186+
* Takes needed options from `replset` and overwrites
187+
* our own options.
188+
*
189+
* @param {ReplSet} replset
190+
* @ignore
191+
*/
192+
Server.prototype.inheritReplSetOptionsFrom = function (replset) {
193+
this.socketOptions = {};
194+
this.socketOptions.connectTimeoutMS = replset._connectTimeoutMS;
195+
196+
if(replset.ssl)
197+
this.socketOptions.ssl = true;
198+
199+
// If a socket option object exists clone it
200+
if(utils.isObject(replset.socketOptions)) {
201+
var keys = Object.keys(replset.socketOptions);
202+
for(var i = 0; i < keys.length; i++)
203+
this.socketOptions[keys[i]] = replset.socketOptions[keys[i]];
204+
}
205+
}
206+
207+
/**
208+
* Opens this server connection.
209+
*
172210
* @ignore
173211
*/
174212
Server.prototype.connect = function(dbInstance, options, callback) {

0 commit comments

Comments
 (0)