diff options
author | Dan Pasette <dan@10gen.com> | 2015-08-03 15:39:38 -0400 |
---|---|---|
committer | Dan Pasette <dan@mongodb.com> | 2015-08-05 18:42:15 -0400 |
commit | e1547eaa68014371d1c70e32cc73e3b5ec23e480 (patch) | |
tree | 0090701b3242a326db3e059810145bdfaad8749d | |
parent | 34b733c0ca7d231949bd7317bab4079a24189875 (diff) | |
download | mongo-e1547eaa68014371d1c70e32cc73e3b5ec23e480.tar.gz |
SERVER-19719 Failure to rollback noPadding should not cause fatal error
-rw-r--r-- | jstests/replsets/rollback_collMod_PowerOf2Sizes.js | 17 | ||||
-rw-r--r-- | src/mongo/db/repl/rs_rollback.cpp | 20 |
2 files changed, 28 insertions, 9 deletions
diff --git a/jstests/replsets/rollback_collMod_PowerOf2Sizes.js b/jstests/replsets/rollback_collMod_PowerOf2Sizes.js index 148ebddec1f..b65fb807e24 100644 --- a/jstests/replsets/rollback_collMod_PowerOf2Sizes.js +++ b/jstests/replsets/rollback_collMod_PowerOf2Sizes.js @@ -33,6 +33,7 @@ var BID = replTest.getNodeId(b_conn); var options = {writeConcern: {w: 2, wtimeout: 60000}, upsert: true}; assert.writeOK(a_conn.getDB(name).foo.insert({x: 1}, options)); +assert.writeOK(a_conn.getDB(name).bar.insert({x: 1}, options)); // shut down master replTest.stop(AID); @@ -41,6 +42,8 @@ replTest.stop(AID); master = replTest.getMaster(); assert(b_conn.host === master.host, "b_conn assumed to be master"); assert.commandWorked(b_conn.getDB(name).runCommand({collMod: "foo", usePowerOf2Sizes: false})); +assert.commandWorked(b_conn.getDB(name).runCommand({collMod: "bar", noPadding: true})); +assert.commandWorked(b_conn.getDB(name).runCommand({collMod: "bar", usePowerOf2Sizes: false, noPadding: true})); // shut down B and bring back the original master replTest.stop(BID); @@ -54,15 +57,25 @@ assert.writeOK(a_conn.getDB(name).foo.insert({x: 2}, options)); // restart B, which should rollback and log a message about not rolling back usePowerOf2Sizes replTest.restart(BID); -var msg = RegExp("replSet not rolling back change of usePowerOf2Sizes: "); +var rollbackMsg = RegExp("replSet not rolling back change of usePowerOf2Sizes: "); assert.soon(function() { try { var log = b_conn.getDB("admin").adminCommand({getLog: "global"}).log; - return doesEntryMatch(log, msg); + return doesEntryMatch(log, rollbackMsg); } catch (e) { return false; } }, "Did not see a log entry about skipping the usePowerOf2Sizes command during rollback"); +var paddingMsg = RegExp("replSet not rolling back change of noPadding: "); +assert.soon(function() { + try { + var log = b_conn.getDB("admin").adminCommand({getLog: "global"}).log; + return doesEntryMatch(log, paddingMsg); + } + catch (e) { + return false; + } +}, "Did not see a log entry about skipping the noPadding command during rollback"); replTest.stopSet(); diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp index e1260054e40..8e621befdfb 100644 --- a/src/mongo/db/repl/rs_rollback.cpp +++ b/src/mongo/db/repl/rs_rollback.cpp @@ -227,11 +227,17 @@ void refetch(FixUpInfo& fixUpInfo, const BSONObj& ourObj) { log() << "replSet " << obj.toString(); throw RSFatalException(); } else if (cmdname == "collMod") { - if (obj.nFields() == 2 && obj["usePowerOf2Sizes"].type() == Bool) { - log() << "replSet not rolling back change of usePowerOf2Sizes: " << obj; - } else { - severe() << "replSet error cannot rollback a collMod command: " << obj; - throw RSFatalException(); + BSONForEach(elt, obj) { + if (elt.fieldNameStringData() == "collMod") { + // ignore the command name. + } else if (elt.fieldNameStringData() == "usePowerOf2Sizes") { + log() << "replSet not rolling back change of usePowerOf2Sizes: " << obj; + } else if (elt.fieldNameStringData() == "noPadding") { + log() << "replSet not rolling back change of noPadding: " << obj; + } else { + severe() << "replSet error cannot rollback this collMod command: " << obj; + throw RSFatalException(); + } } } else { severe() << "replSet error can't rollback this command yet: " << obj.toString(); @@ -242,8 +248,8 @@ void refetch(FixUpInfo& fixUpInfo, const BSONObj& ourObj) { doc._id = obj["_id"]; if (doc._id.eoo()) { - warning() << "replSet WARNING ignoring op on rollback no _id TODO : " << doc.ns << ' ' - << doc.ownedObj.toString(); + warning() << "ignoring op with no _id during rollback. ns: " << doc.ns << ", " + << "document: " << doc.ownedObj.toString(); return; } |