diff options
-rwxr-xr-x | jstests/sharding/read_pref.js | 10 | ||||
-rw-r--r-- | jstests/sharding/read_pref_cmd.js | 2 | ||||
-rw-r--r-- | src/mongo/client/dbclient_rs.cpp | 12 |
3 files changed, 19 insertions, 5 deletions
diff --git a/jstests/sharding/read_pref.js b/jstests/sharding/read_pref.js index 6542a80dab1..fd69f890836 100755 --- a/jstests/sharding/read_pref.js +++ b/jstests/sharding/read_pref.js @@ -100,9 +100,17 @@ assert.eq( 1, explain.n ); // Cannot use tags with primaryOnly assert.throws( function() { - coll.find().readPref( "primaryOnly", [] ).explain(); + coll.find().readPref( "primary", [{ s: "2" }] ).explain(); }); + +// Ok to use empty tags on primaryOnly +explain = coll.find().readPref("primary", [{}]).explain(); +assert.eq(primaryNode.name, explain.server); + +explain = coll.find().readPref("primary", []).explain(); +assert.eq(primaryNode.name, explain.server); + // Check that mongos will try the next tag if nothing matches the first explain = coll.find().readPref( "secondary", [{ z: "3" }, { dc: "jp" }] ).explain(); checkTag( explain.server, { dc: "jp" }); diff --git a/jstests/sharding/read_pref_cmd.js b/jstests/sharding/read_pref_cmd.js index 61bcbd78ddb..320cd035031 100644 --- a/jstests/sharding/read_pref_cmd.js +++ b/jstests/sharding/read_pref_cmd.js @@ -214,7 +214,7 @@ var testAllModes = function(conn, hostList, isMongos) { [ // mode, tagSets, expectedHost ['primary', undefined, false], - //['primary', [{}], false], // TODO: Uncomment once SERVER-8219 is fixed + ['primary', [{}], false], ['primaryPreferred', undefined, false], ['primaryPreferred', [{tag: 'one'}], false], diff --git a/src/mongo/client/dbclient_rs.cpp b/src/mongo/client/dbclient_rs.cpp index 7c588592e25..0b38c33bcda 100644 --- a/src/mongo/client/dbclient_rs.cpp +++ b/src/mongo/client/dbclient_rs.cpp @@ -20,6 +20,7 @@ #include "mongo/client/dbclient_rs.h" #include <fstream> +#include <memory> #include "mongo/base/init.h" #include "mongo/bson/util/builder.h" @@ -244,14 +245,19 @@ namespace mongo { } if (prefDoc.hasField("tags")) { - uassert(16384, "Cannot specify tags for primary only read preference", - *pref != mongo::ReadPreference_PrimaryOnly); + const BSONElement& tagsElem = prefDoc["tags"]; uassert(16385, "tags for read preference should be an array", tagsElem.type() == mongo::Array); - return new TagSet(BSONArray(tagsElem.Obj())); + std::auto_ptr<TagSet> tags(new TagSet(BSONArray(tagsElem.Obj()))); + if (*pref == mongo::ReadPreference_PrimaryOnly && !tags->isExhausted()) { + uassert(16384, "Only empty tags are allowed with primary read preference", + tags->getCurrentTag().isEmpty()); + } + + return tags.release(); } } |