summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xjstests/sharding/read_pref.js10
-rw-r--r--jstests/sharding/read_pref_cmd.js2
-rw-r--r--src/mongo/client/dbclient_rs.cpp12
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();
}
}