summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/replsets/drain.js10
-rw-r--r--jstests/replsets/maintenance.js4
-rw-r--r--jstests/replsets/recovery_mode_read_error.js31
-rw-r--r--src/mongo/db/dbcommands.cpp15
4 files changed, 15 insertions, 45 deletions
diff --git a/jstests/replsets/drain.js b/jstests/replsets/drain.js
index 6561bba8ce6..a81d45f1d10 100644
--- a/jstests/replsets/drain.js
+++ b/jstests/replsets/drain.js
@@ -75,15 +75,7 @@
"find failed with unexpected error code: " + tojson(res));
// Nor should it be readable with the slaveOk bit.
secondary.slaveOk = true;
- res = secondary.getDB("foo").runCommand({find: "foo"});
- assert.commandFailed(res);
- assert.eq(ErrorCodes.NotMasterOrSecondary,
- res.code,
- "find failed with unexpected error code: " + tojson(res));
- secondary.slaveOk = false;
-
- // check to make sure reads are not possible during draining
- assert.eq('node is in drain mode', res.errmsg);
+ assert.commandWorked(secondary.getDB("foo").runCommand({find: "foo"}));
assert.commandFailedWithCode(
secondary.adminCommand({
diff --git a/jstests/replsets/maintenance.js b/jstests/replsets/maintenance.js
index 7e49e07e396..b1fe94efc0e 100644
--- a/jstests/replsets/maintenance.js
+++ b/jstests/replsets/maintenance.js
@@ -75,6 +75,10 @@ assert.soon(function() {
return !im.secondary && !im.ismaster;
});
+var recv = conns[1].getDB("admin").runCommand({find: "foo"});
+assert.commandFailed(recv);
+assert.eq(recv.errmsg, "node is recovering");
+
print("now getmore shouldn't work");
var ex = assert.throws(function() {
lastDoc = null;
diff --git a/jstests/replsets/recovery_mode_read_error.js b/jstests/replsets/recovery_mode_read_error.js
deleted file mode 100644
index 7958572835c..00000000000
--- a/jstests/replsets/recovery_mode_read_error.js
+++ /dev/null
@@ -1,31 +0,0 @@
-
-/*
- This test checks to make sure nodes that are in RECOVERING mode
- cannot accept reads and throw the correct errors.
- - use replSetMaintenance to send secondary into recovering mode
- - run a find() on secondary to make sure it throws the "node is
- recovering" error message
-
-*/
-
-(function() {
- "use strict";
- var replTest = new ReplSetTest({name: 'recovery_mode_read_error', nodes: 2});
- var conns = replTest.startSet();
-
- replTest.initiate();
-
- // Make sure we have a master
- var primary = replTest.getPrimary();
- primary.getDB("bar").foo.insert({foo: 3});
-
- var secondary = replTest.getSecondary();
-
- print("secondary going into maintenance mode (recovery mode)");
- assert.commandWorked(secondary.adminCommand({replSetMaintenance: 1}));
-
- var recv = secondary.getDB("bar").runCommand({find: "foo"});
- assert.commandFailed(recv);
- assert.eq(recv.errmsg, "node is recovering");
-
-})();
diff --git a/src/mongo/db/dbcommands.cpp b/src/mongo/db/dbcommands.cpp
index 6e5cfb2d849..9b5a6c3c6c8 100644
--- a/src/mongo/db/dbcommands.cpp
+++ b/src/mongo/db/dbcommands.cpp
@@ -1330,11 +1330,16 @@ void Command::execCommand(OperationContext* txn,
!replCoord->canAcceptWritesForDatabase(dbname) &&
!replCoord->getMemberState().secondary()) {
- if (replCoord->getMemberState().recovering()) {
- uasserted(ErrorCodes::NotMasterOrSecondary, "node is recovering");
- }
- invariant(replCoord->getMemberState().primary());
- uasserted(ErrorCodes::NotMasterOrSecondary, "node is in drain mode");
+ uassert(ErrorCodes::NotMasterOrSecondary,
+ "node is recovering",
+ !replCoord->getMemberState().recovering());
+ uassert(ErrorCodes::NotMasterOrSecondary,
+ "node is not in primary or recovering state",
+ replCoord->getMemberState().primary());
+ // Check ticket SERVER-21432, slaveOk commands are allowed in drain mode
+ uassert(ErrorCodes::NotMasterOrSecondary,
+ "node is in drain mode",
+ commandIsOverriddenToRunOnSecondary || commandCanRunOnSecondary);
}
}