mongodb-core
Advanced tools
Comparing version 2.1.11 to 2.1.12
@@ -0,1 +1,12 @@ | ||
2.1.12 2017-06-02 | ||
----------------- | ||
* NODE-1019 Set keepAlive to 300 seconds or 1/2 of socketTimeout if socketTimeout < keepAlive. | ||
* Minor fix to report the correct state on error. | ||
* NODE-1020 'family' was added to options to provide high priority for ipv6 addresses (Issue #1518, https://github.com/firej). | ||
* Fix require_optional loading of bson-ext. | ||
* Ensure no errors are thrown by replset if topology is destroyed before it finished connecting. | ||
* NODE-999 SDAM fixes for Mongos and single Server event emitting. | ||
* NODE-1014 Set socketTimeout to default to 360 seconds. | ||
* NODE-1019 Set keepAlive to 300 seconds or 1/2 of socketTimeout if socketTimeout < keepAlive. | ||
2.1.11 2017-05-22 | ||
@@ -2,0 +13,0 @@ ----------------- |
11
index.js
var BSON = require('bson'); | ||
var require_optional = require('require_optional'); | ||
try { | ||
// try { BSON = require('bson-ext'); } catch(err) { | ||
BSON = require_optional('bson-ext'); | ||
// } | ||
// Attempt to grab the native BSON parser | ||
var BSONNative = require_optional('bson-ext'); | ||
// If we got the native parser, use it instead of the | ||
// Javascript one | ||
if(BSONNative) { | ||
BSON = BSONNative | ||
} | ||
} catch(err) {} | ||
@@ -8,0 +13,0 @@ |
@@ -26,7 +26,8 @@ "use strict"; | ||
* @param {number} options.port The server port | ||
* @param {number} [options.family=4] Version of IP stack. Defaults to 4. | ||
* @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=0] Initial delay before TCP keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=300000] Initial delay before TCP keep alive enabled | ||
* @param {boolean} [options.noDelay=true] TCP Connection no delay | ||
* @param {number} [options.connectionTimeout=0] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=0] TCP Socket timeout setting | ||
* @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=360000] TCP Socket timeout setting | ||
* @param {boolean} [options.singleBufferSerializtion=true] Serialize into single buffer, trade of peak memory for serialization speed | ||
@@ -77,8 +78,17 @@ * @param {boolean} [options.ssl=false] Use SSL for connection | ||
this.host = options.host || 'localhost'; | ||
this.family = typeof options.family == 'number' ? options.family : 4; | ||
this.keepAlive = typeof options.keepAlive == 'boolean' ? options.keepAlive : true; | ||
this.keepAliveInitialDelay = options.keepAliveInitialDelay || 0; | ||
this.keepAliveInitialDelay = typeof options.keepAliveInitialDelay == 'number' | ||
? options.keepAliveInitialDelay : 300000; | ||
this.noDelay = typeof options.noDelay == 'boolean' ? options.noDelay : true; | ||
this.connectionTimeout = options.connectionTimeout || 0; | ||
this.socketTimeout = options.socketTimeout || 0; | ||
this.connectionTimeout = typeof options.connectionTimeout == 'number' | ||
? options.connectionTimeout : 30000; | ||
this.socketTimeout = typeof options.socketTimeout == 'number' | ||
? options.socketTimeout : 360000; | ||
// Is the keepAliveInitialDelay > socketTimeout set it to half of socketTimeout | ||
if(this.keepAliveInitialDelay > this.socketTimeout) { | ||
this.keepAliveInitialDelay = Math.round(this.socketTimeout/2); | ||
} | ||
// If connection was destroyed | ||
@@ -401,5 +411,6 @@ this.destroyed = false; | ||
// Create new connection instance | ||
self.connection = self.domainSocket | ||
? net.createConnection(self.host) | ||
: net.createConnection(self.port, self.host); | ||
var connection_options = self.domainSocket | ||
? {path: self.host} | ||
: {port: self.port, host: self.host, family: self.family}; | ||
self.connection = net.createConnection(connection_options); | ||
@@ -406,0 +417,0 @@ // Set the options for the connection |
@@ -38,6 +38,6 @@ "use strict"; | ||
* @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=0] Initial delay before TCP keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=300000] Initial delay before TCP keep alive enabled | ||
* @param {boolean} [options.noDelay=true] TCP Connection no delay | ||
* @param {number} [options.connectionTimeout=0] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=0] TCP Socket timeout setting | ||
* @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=360000] TCP Socket timeout setting | ||
* @param {number} [options.monitoringSocketTimeout=30000] TCP Socket timeout setting for replicaset monitoring socket | ||
@@ -75,5 +75,5 @@ * @param {boolean} [options.ssl=false] Use SSL for connection | ||
connectionTimeout: 30000, | ||
socketTimeout: 30000, | ||
socketTimeout: 360000, | ||
keepAlive: true, | ||
keepAliveInitialDelay: 0, | ||
keepAliveInitialDelay: 300000, | ||
noDelay: true, | ||
@@ -80,0 +80,0 @@ // SSL Settings |
@@ -71,12 +71,7 @@ "use strict"; | ||
try { | ||
// try { | ||
// BSON = require('bson-ext'); | ||
// BSON.native = true; | ||
// } catch(err) { | ||
var optionalBSON = require_optional('bson-ext'); | ||
if(optionalBSON) { | ||
optionalBSON.native = true; | ||
return optionalBSON; | ||
} | ||
// } | ||
var optionalBSON = require_optional('bson-ext'); | ||
if(optionalBSON) { | ||
optionalBSON.native = true; | ||
return optionalBSON; | ||
} | ||
} catch(err) {} | ||
@@ -83,0 +78,0 @@ |
@@ -13,2 +13,4 @@ "use strict" | ||
clone = require('./shared').clone, | ||
sdam = require('./shared'), | ||
diff = require('./shared').diff, | ||
cloneOptions = require('./shared').cloneOptions, | ||
@@ -195,2 +197,7 @@ createClientInfo = require('./shared').createClientInfo; | ||
// Description of the Replicaset | ||
this.topologyDescription = { | ||
"topologyType": "Unknown", "servers": [] | ||
}; | ||
// Add event listener | ||
@@ -242,2 +249,6 @@ EventEmitter.call(this); | ||
servers.forEach(function(server) { | ||
server.on('serverDescriptionChanged', function(event) { self.emit('serverDescriptionChanged', event); }); | ||
}); | ||
// Emit the topology opening event | ||
@@ -255,4 +266,11 @@ emitSDAMEvent(this, 'topologyOpening', { topologyId: this.id }); | ||
moveServerFrom(self.connectedProxies, self.disconnectedProxies, this); | ||
// Emit the initial topology | ||
emitTopologyDescriptionChanged(self); | ||
// Emit the left signal | ||
self.emit('left', 'mongos', this); | ||
// Emit the sdam event | ||
self.emit('serverClosed', { | ||
topologyId: self.id, | ||
address: this.name | ||
}); | ||
} | ||
@@ -267,2 +285,4 @@ } | ||
if(self.state == DESTROYED) { | ||
// Emit the initial topology | ||
emitTopologyDescriptionChanged(self); | ||
// Move from connectingProxies | ||
@@ -287,2 +307,4 @@ moveServerFrom(self.connectingProxies, self.disconnectedProxies, this); | ||
moveServerFrom(self.connectingProxies, self.disconnectedProxies, _this); | ||
// Emit the initial topology | ||
emitTopologyDescriptionChanged(self); | ||
_this.destroy(); | ||
@@ -337,2 +359,5 @@ return self.emit('failed', _this); | ||
// Emit the initial topology | ||
emitTopologyDescriptionChanged(self); | ||
// Trigger topologyMonitor | ||
@@ -374,2 +399,11 @@ if(self.connectingProxies.length == 0) { | ||
setTimeout(function() { | ||
// Emit opening server event | ||
self.emit('serverOpening', { | ||
topologyId: self.id, | ||
address: server.name | ||
}); | ||
// Emit the initial topology | ||
emitTopologyDescriptionChanged(self); | ||
// Add event handlers | ||
@@ -381,6 +415,2 @@ server.once('close', handleInitialConnectEvent(self, 'close')); | ||
server.once('connect', handleInitialConnectEvent(self, 'connect')); | ||
// SDAM Monitoring events | ||
server.on('serverOpening', function(e) { self.emit('serverOpening', e); }); | ||
server.on('serverDescriptionChanged', function(e) { self.emit('serverDescriptionChanged', e); }); | ||
server.on('serverClosed', function(e) { self.emit('serverClosed', e); }); | ||
// Start connection | ||
@@ -468,2 +498,3 @@ server.connect(self.s.connectOptions); | ||
moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self); | ||
// Return destroy | ||
return this.destroy(); | ||
@@ -494,2 +525,4 @@ } | ||
moveServerFrom(self.disconnectedProxies, self.connectedProxies, _self); | ||
// Emit topology Change | ||
emitTopologyDescriptionChanged(self); | ||
// Emit joined event | ||
@@ -534,2 +567,11 @@ self.emit('joined', 'mongos', _self); | ||
// Relay the server description change | ||
server.on('serverDescriptionChanged', function(event) { self.emit('serverDescriptionChanged', event); }); | ||
// Emit opening server event | ||
self.emit('serverOpening', { | ||
topologyId: server.s.topologyId != -1 ? server.s.topologyId : self.id, | ||
address: server.name | ||
}); | ||
// Add temp handlers | ||
@@ -542,6 +584,3 @@ server.once('connect', _handleEvent(self, 'connect')); | ||
// SDAM Monitoring events | ||
server.on('serverOpening', function(e) { self.emit('serverOpening', e); }); | ||
server.on('serverDescriptionChanged', function(e) { self.emit('serverDescriptionChanged', e); }); | ||
server.on('serverClosed', function(e) { self.emit('serverClosed', e); }); | ||
// Connect to proxy | ||
server.connect(self.s.connectOptions); | ||
@@ -727,2 +766,3 @@ }, i); | ||
Mongos.prototype.destroy = function(options) { | ||
var self = this; | ||
// Transition state | ||
@@ -739,5 +779,16 @@ stateTransition(this, DESTROYED); | ||
proxies.forEach(function(x) { | ||
// Emit the sdam event | ||
self.emit('serverClosed', { | ||
topologyId: self.id, | ||
address: x.name | ||
}); | ||
// Destroy the server | ||
x.destroy(options); | ||
// Move to list of disconnectedProxies | ||
moveServerFrom(self.connectedProxies, self.disconnectedProxies, x); | ||
}); | ||
// Emit the final topology change | ||
emitTopologyDescriptionChanged(self); | ||
// Emit toplogy closing event | ||
@@ -1108,2 +1159,56 @@ emitSDAMEvent(this, 'topologyClosed', { topologyId: this.id }); | ||
function emitTopologyDescriptionChanged(self) { | ||
if(self.listeners('topologyDescriptionChanged').length > 0) { | ||
var topology = 'Unknown'; | ||
var setName = self.setName; | ||
if(self.connectedProxies.length > 0) { | ||
topology = 'Sharded'; | ||
} | ||
// Generate description | ||
var description = { | ||
topologyType: topology, | ||
servers: [] | ||
} | ||
// All proxies | ||
var proxies = self.disconnectedProxies | ||
.concat(self.connectingProxies); | ||
// Add all the disconnected proxies | ||
description.servers = description.servers.concat(proxies.map(function(x) { | ||
var description = x.getDescription(); | ||
description.type = 'Unknown'; | ||
return description; | ||
})); | ||
// Add all the connected proxies | ||
description.servers = description.servers.concat(self.connectedProxies.map(function(x) { | ||
var description = x.getDescription(); | ||
description.type = 'Mongos'; | ||
return description; | ||
})); | ||
// Get the diff | ||
var diffResult = diff(self.topologyDescription, description); | ||
// Create the result | ||
var result = { | ||
topologyId: self.id, | ||
previousDescription: self.topologyDescription, | ||
newDescription: description, | ||
diff: diffResult | ||
}; | ||
// Emit the topologyDescription change | ||
if(diffResult.servers.length > 0) { | ||
self.emit('topologyDescriptionChanged', result); | ||
} | ||
// Set the new description | ||
self.topologyDescription = description; | ||
} | ||
} | ||
/** | ||
@@ -1110,0 +1215,0 @@ * A mongos connect event, used to verify that the connection is up and running |
@@ -5,2 +5,3 @@ "use strict" | ||
f = require('util').format, | ||
diff = require('./shared').diff, | ||
EventEmitter = require('events').EventEmitter, | ||
@@ -121,2 +122,5 @@ Logger = require('../connection/logger'), | ||
this.set = {}; | ||
this.primary = null; | ||
// Emit the topology changed | ||
emitTopologyDescriptionChanged(this); | ||
} | ||
@@ -960,2 +964,5 @@ | ||
// Get the diff | ||
var diffResult = diff(self.replicasetDescription, description); | ||
// Create the result | ||
@@ -966,7 +973,9 @@ var result = { | ||
newDescription: description, | ||
diff: diff(self.replicasetDescription, description) | ||
diff: diffResult, | ||
}; | ||
// Emit the topologyDescription change | ||
self.emit('topologyDescriptionChanged', result); | ||
// if(diffResult.servers.length > 0) { | ||
self.emit('topologyDescriptionChanged', result); | ||
// } | ||
@@ -978,39 +987,2 @@ // Set the new description | ||
function diff(previous, current) { | ||
// Difference document | ||
var diff = { | ||
servers: [] | ||
} | ||
// Previous entry | ||
if(!previous) { | ||
previous = { servers: [] }; | ||
} | ||
// Got through all the servers | ||
for(var i = 0; i < previous.servers.length; i++) { | ||
var prevServer = previous.servers[i]; | ||
// Go through all current servers | ||
for(var j = 0; j < current.servers.length; j++) { | ||
var currServer = current.servers[j]; | ||
// Matching server | ||
if(prevServer.address.toLowerCase() === currServer.address.toLowerCase()) { | ||
// We had a change in state | ||
if(prevServer.type != currServer.type) { | ||
diff.servers.push({ | ||
address: prevServer.address, | ||
from: prevServer.type, | ||
to: currServer.type | ||
}); | ||
} | ||
} | ||
} | ||
} | ||
// Return difference | ||
return diff; | ||
} | ||
module.exports = ReplSetState; |
@@ -553,2 +553,7 @@ "use strict" | ||
return connectNewServers(self, self.s.replicaSetState.unknownServers, function(err) { | ||
// Don't emit errors if the connection was already | ||
if(self.state === DESTROYED || self.state === UNREFERENCED) { | ||
return; | ||
} | ||
if(!self.s.replicaSetState.hasPrimary() && !self.s.options.secondaryOnlyConnectionAllowed) { | ||
@@ -555,0 +560,0 @@ if(err) return self.emit('error', err); |
"use strict" | ||
var inherits = require('util').inherits, | ||
require_optional = require('require_optional'), | ||
f = require('util').format, | ||
@@ -47,6 +46,6 @@ EventEmitter = require('events').EventEmitter, | ||
* @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=0] Initial delay before TCP keep alive enabled | ||
* @param {number} [options.keepAliveInitialDelay=300000] Initial delay before TCP keep alive enabled | ||
* @param {boolean} [options.noDelay=true] TCP Connection no delay | ||
* @param {number} [options.connectionTimeout=0] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=0] TCP Socket timeout setting | ||
* @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting | ||
* @param {number} [options.socketTimeout=360000] TCP Socket timeout setting | ||
* @param {boolean} [options.ssl=false] Use SSL for connection | ||
@@ -286,9 +285,11 @@ * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. | ||
sdam.emitServerDescriptionChanged(self, { | ||
address: self.name, arbiters: [], hosts: [], passives: [], type: !self.s.inTopology ? 'Standalone' : sdam.getTopologyType(self) | ||
address: self.name, arbiters: [], hosts: [], passives: [], type: sdam.getTopologyType(self) | ||
}); | ||
// Emit topology description changed if something listening | ||
sdam.emitTopologyDescriptionChanged(self, { | ||
topologyType: 'Single', servers: [{address: self.name, arbiters: [], hosts: [], passives: [], type: 'Standalone'}] | ||
}); | ||
if(!self.s.inTopology) { | ||
// Emit topology description changed if something listening | ||
sdam.emitTopologyDescriptionChanged(self, { | ||
topologyType: 'Single', servers: [{address: self.name, arbiters: [], hosts: [], passives: [], type: 'Standalone'}] | ||
}); | ||
} | ||
@@ -358,3 +359,3 @@ // Log the ismaster if available | ||
if(self.s.pool && !self.s.pool.isDisconnected() && !self.s.pool.isDestroyed()) { | ||
throw MongoError.create(f('server instance in invalid state %s', self.s.state)); | ||
throw MongoError.create(f('server instance in invalid state %s', self.s.pool.state)); | ||
} | ||
@@ -361,0 +362,0 @@ |
@@ -126,4 +126,4 @@ "use strict" | ||
if(!ismaster) return 'Unknown'; | ||
if(ismaster.ismaster && ismaster.msg == 'isdbgrid') return 'Mongos'; | ||
if(ismaster.ismaster && !ismaster.hosts) return 'Standalone'; | ||
if(ismaster.ismaster && ismaster.msg == 'isdbgrid') return 'Mongos'; | ||
if(ismaster.ismaster) return 'RSPrimary'; | ||
@@ -263,2 +263,84 @@ if(ismaster.secondary) return 'RSSecondary'; | ||
function diff(previous, current) { | ||
// Difference document | ||
var diff = { | ||
servers: [] | ||
} | ||
// Previous entry | ||
if(!previous) { | ||
previous = { servers: [] }; | ||
} | ||
// Check if we have any previous servers missing in the current ones | ||
for(var i = 0; i < previous.servers.length; i++) { | ||
var found = false; | ||
for(var j = 0; j < current.servers.length; j++) { | ||
if(current.servers[j].address.toLowerCase() | ||
=== previous.servers[i].address.toLowerCase()) { | ||
found = true; | ||
break; | ||
} | ||
} | ||
if(!found) { | ||
// Add to the diff | ||
diff.servers.push({ | ||
address: previous.servers[i].address, | ||
from: previous.servers[i].type, | ||
to: 'Unknown', | ||
}); | ||
} | ||
} | ||
// Check if there are any severs that don't exist | ||
for(var j = 0; j < current.servers.length; j++) { | ||
var found = false; | ||
// Go over all the previous servers | ||
for(var i = 0; i < previous.servers.length; i++) { | ||
if(previous.servers[i].address.toLowerCase() | ||
=== current.servers[j].address.toLowerCase()) { | ||
found = true; | ||
break; | ||
} | ||
} | ||
// Add the server to the diff | ||
if(!found) { | ||
diff.servers.push({ | ||
address: current.servers[j].address, | ||
from: 'Unknown', | ||
to: current.servers[j].type, | ||
}); | ||
} | ||
} | ||
// Got through all the servers | ||
for(var i = 0; i < previous.servers.length; i++) { | ||
var prevServer = previous.servers[i]; | ||
// Go through all current servers | ||
for(var j = 0; j < current.servers.length; j++) { | ||
var currServer = current.servers[j]; | ||
// Matching server | ||
if(prevServer.address.toLowerCase() === currServer.address.toLowerCase()) { | ||
// We had a change in state | ||
if(prevServer.type != currServer.type) { | ||
diff.servers.push({ | ||
address: prevServer.address, | ||
from: prevServer.type, | ||
to: currServer.type | ||
}); | ||
} | ||
} | ||
} | ||
} | ||
// Return difference | ||
return diff; | ||
} | ||
module.exports.inquireServerState = inquireServerState | ||
@@ -272,3 +354,4 @@ module.exports.getTopologyType = getTopologyType; | ||
module.exports.clone = clone; | ||
module.exports.diff = diff; | ||
module.exports.Interval = Interval; | ||
module.exports.Timeout = Timeout; |
{ | ||
"name": "mongodb-core", | ||
"version": "2.1.11", | ||
"version": "2.1.12", | ||
"description": "Core MongoDB driver functionality, no bells and whistles and meant for integration not end applications", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
609369
10651