Skip to content

Commit c7e7c1e

Browse files
committed
Added test to allow correct passing of maxstalenessms down
1 parent 8d6befb commit c7e7c1e

12 files changed

+2887
-2384
lines changed

lib/aggregation_cursor.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ var inherits = require('util').inherits
1313
, Readable = require('stream').Readable || require('readable-stream').Readable
1414
, Define = require('./metadata')
1515
, CoreCursor = require('./cursor')
16-
, Query = require('mongodb-core').Query
17-
, CoreReadPreference = require('mongodb-core').ReadPreference;
16+
, Query = require('mongodb-core').Query;
1817

1918
/**
2019
* @fileOverview The **AggregationCursor** class is an internal class that embodies an aggregation cursor on MongoDB

lib/collection.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ Collection.prototype.find = function() {
282282

283283
// Add read preference if needed
284284
newOptions = getReadPreference(this, newOptions, this.s.db, this);
285+
285286
// Set slave ok to true if read preference different from primary
286287
if(newOptions.readPreference != null
287288
&& (newOptions.readPreference != 'primary' || newOptions.readPreference.mode != 'primary')) {
@@ -3272,18 +3273,18 @@ var getReadPreference = function(self, options, db, coll) {
32723273
r = options.readPreference
32733274
} else if(self.s.readPreference) {
32743275
r = self.s.readPreference
3275-
} else if(db.readPreference) {
3276-
r = db.readPreference;
3276+
} else if(db.s.readPreference) {
3277+
r = db.s.readPreference;
32773278
}
32783279

32793280
if(r instanceof ReadPreference) {
3280-
options.readPreference = new CoreReadPreference(r.mode, r.tags);
3281+
options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS});
32813282
} else if(typeof r == 'string') {
32823283
options.readPreference = new CoreReadPreference(r);
32833284
} else if(r && !(r instanceof ReadPreference) && typeof r == 'object') {
32843285
var mode = r.mode || r.preference;
32853286
if (mode && typeof mode == 'string') {
3286-
options.readPreference = new CoreReadPreference(mode, r.tags);
3287+
options.readPreference = new CoreReadPreference(mode, r.tags, {maxStalenessMS: r.maxStalenessMS});
32873288
}
32883289
}
32893290

lib/command_cursor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ CommandCursor.prototype.setReadPreference = function(r) {
163163
if(this.s.state != CommandCursor.INIT) throw MongoError.create({message: 'cannot change cursor readPreference after cursor has been accessed', driver:true});
164164

165165
if(r instanceof ReadPreference) {
166-
this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags);
166+
this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS});
167167
} else if(typeof r == 'string') {
168168
this.s.options.readPreference = new CoreReadPreference(r);
169169
} else if(r instanceof CoreReadPreference) {

lib/cursor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ define.classMethod('forEach', {callback: true, promise:false});
793793
Cursor.prototype.setReadPreference = function(r) {
794794
if(this.s.state != Cursor.INIT) throw MongoError.create({message: 'cannot change cursor readPreference after cursor has been accessed', driver:true});
795795
if(r instanceof ReadPreference) {
796-
this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags);
796+
this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS});
797797
} else if(typeof r == 'string'){
798798
this.s.options.readPreference = new CoreReadPreference(r);
799799
} else if(r instanceof CoreReadPreference) {

lib/db.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -264,11 +264,11 @@ var convertReadPreference = function(readPreference) {
264264
if(readPreference && typeof readPreference == 'string') {
265265
return new CoreReadPreference(readPreference);
266266
} else if(readPreference instanceof ReadPreference) {
267-
return new CoreReadPreference(readPreference.mode, readPreference.tags);
267+
return new CoreReadPreference(readPreference.mode, readPreference.tags, {maxStalenessMS: readPreference.maxStalenessMS});
268268
} else if(readPreference && typeof readPreference == 'object') {
269269
var mode = readPreference.mode || readPreference.preference;
270270
if (mode && typeof mode == 'string') {
271-
readPreference = new CoreReadPreference(mode, readPreference.tags);
271+
readPreference = new CoreReadPreference(mode, readPreference.tags, {maxStalenessMS: readPreference.maxStalenessMS});
272272
}
273273
}
274274
return readPreference;
@@ -1162,29 +1162,28 @@ Db.prototype.addChild = function(db) {
11621162
*/
11631163
Db.prototype.db = function(dbName, options) {
11641164
options = options || {};
1165+
11651166
// Copy the options and add out internal override of the not shared flag
1166-
for(var key in this.options) {
1167-
options[key] = this.options[key];
1168-
}
1167+
var finalOptions = assign({}, this.options, options);
11691168

11701169
// Do we have the db in the cache already
1171-
if(this.s.dbCache[dbName] && options.returnNonCachedInstance !== true) {
1170+
if(this.s.dbCache[dbName] && finalOptions.returnNonCachedInstance !== true) {
11721171
return this.s.dbCache[dbName];
11731172
}
11741173

11751174
// Add current db as parentDb
1176-
if(options.noListener == null || options.noListener == false) {
1177-
options.parentDb = this;
1175+
if(finalOptions.noListener == null || finalOptions.noListener == false) {
1176+
finalOptions.parentDb = this;
11781177
}
11791178

11801179
// Add promiseLibrary
1181-
options.promiseLibrary = this.s.promiseLibrary;
1180+
finalOptions.promiseLibrary = this.s.promiseLibrary;
11821181

11831182
// Return the db object
1184-
var db = new Db(dbName, this.s.topology, options)
1183+
var db = new Db(dbName, this.s.topology, finalOptions)
11851184

11861185
// Add as child
1187-
if(options.noListener == null || options.noListener == false) {
1186+
if(finalOptions.noListener == null || finalOptions.noListener == false) {
11881187
this.addChild(db);
11891188
}
11901189

lib/mongo_client.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ function translateOptions(options) {
161161
options.readPreference.tags = options.readPreferenceTags || options.read_preference_tags;
162162
}
163163

164+
// Do we have maxStalenessMS
165+
if(options.maxStalenessMS) {
166+
options.readPreference.maxStalenessMS = options.maxStalenessMS;
167+
}
168+
164169
// Set the socket and connection timeouts
165170
if(!options.socketTimeoutMS == null) options.socketTimeoutMS = 30000;
166171
if(!options.connectTimeoutMS == null) options.connectTimeoutMS = 30000;

lib/read_preference.js

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/**
44
* @fileOverview The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is
55
* used to construct connections.
6-
*
6+
*
77
* @example
88
* var Db = require('mongodb').Db,
99
* ReplSet = require('mongodb').ReplSet,
@@ -27,7 +27,7 @@
2727

2828
/**
2929
* Creates a new ReadPreference instance
30-
*
30+
*
3131
* Read Preferences
3232
* - **ReadPreference.PRIMARY**, Read from primary only. All operations produce an error (throw an exception where applicable) if primary is unavailable. Cannot be combined with tags (This is the default.).
3333
* - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary.
@@ -37,17 +37,34 @@
3737
*
3838
* @class
3939
* @param {string} mode The ReadPreference mode as listed above.
40-
* @param {object} tags An object representing read preference tags.
40+
* @param {array} tags An object representing read preference tags.
41+
* @param {object} [options] Additional read preference options
42+
* @param {number} [options.maxStalenessMS] Max Secondary Read Stalleness in Miliseconds
4143
* @property {string} mode The ReadPreference mode.
42-
* @property {object} tags The ReadPreference tags.
44+
* @property {array} tags The ReadPreference tags.
45+
* @property {object} options Additional read preference options
46+
* @property {number} maxStalenessMS MaxStalenessMS value for the read preference
4347
* @return {ReadPreference} a ReadPreference instance.
44-
*/
45-
var ReadPreference = function(mode, tags) {
46-
if(!(this instanceof ReadPreference))
47-
return new ReadPreference(mode, tags);
48+
*/
49+
var ReadPreference = function(mode, tags, options) {
50+
if(!(this instanceof ReadPreference)) {
51+
return new ReadPreference(mode, tags, options);
52+
}
53+
4854
this._type = 'ReadPreference';
4955
this.mode = mode;
5056
this.tags = tags;
57+
this.options = options;
58+
59+
// If no tags were passed in
60+
if(tags && typeof tags == 'object') {
61+
this.options = tags, this.tags = null;
62+
}
63+
64+
// Add the maxStalenessMS value to the read Preference
65+
if(this.options && this.options.maxStalenessMS) {
66+
this.maxStalenessMS = this.options.maxStalenessMS;
67+
}
5168
}
5269

5370
/**
@@ -56,7 +73,7 @@ var ReadPreference = function(mode, tags) {
5673
* @method
5774
* @param {string} mode The string representing the read preference mode.
5875
* @return {boolean}
59-
*/
76+
*/
6077
ReadPreference.isValid = function(_mode) {
6178
return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED
6279
|| _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED
@@ -70,7 +87,7 @@ ReadPreference.isValid = function(_mode) {
7087
* @method
7188
* @param {string} mode The string representing the read preference mode.
7289
* @return {boolean}
73-
*/
90+
*/
7491
ReadPreference.prototype.isValid = function(mode) {
7592
var _mode = typeof mode == 'string' ? mode : this.mode;
7693
return ReadPreference.isValid(_mode);
@@ -86,9 +103,20 @@ ReadPreference.prototype.toObject = function() {
86103
object['tags'] = this.tags;
87104
}
88105

106+
if(this.maxStalenessMS) {
107+
object['maxStalenessMS'] = this.maxStalenessMS;
108+
}
109+
89110
return object;
90111
}
91112

113+
/**
114+
* @ignore
115+
*/
116+
ReadPreference.prototype.toJSON = function() {
117+
return this.toObject();
118+
}
119+
92120
/**
93121
* @ignore
94122
*/
@@ -101,4 +129,4 @@ ReadPreference.NEAREST = 'nearest'
101129
/**
102130
* @ignore
103131
*/
104-
module.exports = ReadPreference;
132+
module.exports = ReadPreference;

lib/replset.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ var translateReadPreference = function(options) {
237237
options.readPreference = new CoreReadPreference(options.readPreference);
238238
} else if(options.readPreference instanceof ReadPreference) {
239239
options.readPreference = new CoreReadPreference(options.readPreference.mode
240-
, options.readPreference.tags);
240+
, options.readPreference.tags, {maxStalenessMS: options.readPreference.maxStalenessMS});
241241
}
242242

243243
return options;

lib/url_parser.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,9 @@ module.exports = function(url, options) {
355355
if(!ReadPreference.isValid(value)) throw new Error("readPreference must be either primary/primaryPreferred/secondary/secondaryPreferred/nearest");
356356
dbOptions.readPreference = value;
357357
break;
358+
case 'maxStalenessMS':
359+
dbOptions.maxStalenessMS = parseInt(value, 10);
360+
break;
358361
case 'readPreferenceTags':
359362
// Decode the value
360363
value = decodeURIComponent(value);

0 commit comments

Comments
 (0)