Skip to content

Commit 7e614ec

Browse files
committed
JAVA-669: Setting $readPreference meta-operator for commands sent to mongos
1 parent 6d74c73 commit 7e614ec

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

src/main/com/mongodb/DB.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ public DB( Mongo mongo , String name ){
6464
}
6565

6666
/**
67-
* Tests if database commands are read preference obedient
68-
* @param command the <code>DBObject</code> to test obedience
69-
* @return true if the command is obedient
67+
* Determines the read preference that should be used for the given command.
68+
* @param command the <code>DBObject</code> representing the command
69+
* @param requestedPreference the preference requested by the client.
70+
* @return the read preference to use for the given command. It will never return null.
7071
* @see com.mongodb.ReadPreference
7172
*/
7273
ReadPreference getCommandReadPreference(DBObject command, ReadPreference requestedPreference){
@@ -93,6 +94,8 @@ ReadPreference getCommandReadPreference(DBObject command, ReadPreference request
9394

9495
if (primaryRequired) {
9596
return ReadPreference.primary();
97+
} else if (requestedPreference == null) {
98+
return ReadPreference.primary();
9699
} else {
97100
return requestedPreference;
98101
}
@@ -253,9 +256,13 @@ public CommandResult command( DBObject cmd , int options, ReadPreference readPre
253256
* @dochub commands
254257
*/
255258
public CommandResult command( DBObject cmd , int options, ReadPreference readPrefs, DBEncoder encoder ){
256-
257259
readPrefs = getCommandReadPreference(cmd, readPrefs);
258-
260+
261+
// TODO: automate an integration test for this condition
262+
if (getMongo().isMongosConnection()) {
263+
cmd.put(QueryOpBuilder.READ_PREFERENCE_META_OPERATOR, readPrefs.toDBObject());
264+
}
265+
259266
Iterator<DBObject> i =
260267
getCollection("$cmd").__find(cmd, new BasicDBObject(), 0, -1, 0, options, readPrefs ,
261268
DefaultDBDecoder.FACTORY.create(), encoder);

src/main/com/mongodb/QueryOpBuilder.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.mongodb;
22

3-
import com.mongodb.BasicDBObject;
4-
import com.mongodb.DBObject;
5-
6-
73
/**
84
* Utility for constructing Query operation command with query, orderby, hint, explain, snapshot.
95
*/
106
class QueryOpBuilder {
11-
12-
private DBObject query;
7+
8+
static final String READ_PREFERENCE_META_OPERATOR = "$readPreference";
9+
10+
private DBObject query;
1311
private DBObject orderBy;
1412
private DBObject hintObj;
1513
private String hintStr;
@@ -131,7 +129,7 @@ public DBObject get(){
131129
if (snapshot)
132130
queryop.put("$snapshot", true);
133131
if (readPref != null)
134-
queryop.put("$readPreference", readPref);
132+
queryop.put(READ_PREFERENCE_META_OPERATOR, readPref);
135133

136134
return queryop;
137135
}

src/test/com/mongodb/DBTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ public void testReadPreferenceObedience() {
118118

119119
obj = new BasicDBObject("serverStatus", 1);
120120
assertEquals(ReadPreference.primary(), _db.getCommandReadPreference(obj, ReadPreference.secondary()));
121+
122+
obj = new BasicDBObject("count", 1);
123+
assertEquals(ReadPreference.primary(), _db.getCommandReadPreference(obj, null));
121124
}
122125

123126
@Test(groups = {"basic"})

0 commit comments

Comments
 (0)