diff options
-rw-r--r-- | jstests/replsets/drain.js | 10 | ||||
-rw-r--r-- | jstests/replsets/maintenance.js | 4 | ||||
-rw-r--r-- | jstests/replsets/recovery_mode_read_error.js | 31 | ||||
-rw-r--r-- | src/mongo/db/dbcommands.cpp | 15 |
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); } } |