summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Pasette <dan@10gen.com>2015-08-03 15:39:38 -0400
committerDan Pasette <dan@mongodb.com>2015-08-05 18:42:15 -0400
commite1547eaa68014371d1c70e32cc73e3b5ec23e480 (patch)
tree0090701b3242a326db3e059810145bdfaad8749d
parent34b733c0ca7d231949bd7317bab4079a24189875 (diff)
downloadmongo-e1547eaa68014371d1c70e32cc73e3b5ec23e480.tar.gz
SERVER-19719 Failure to rollback noPadding should not cause fatal error
-rw-r--r--jstests/replsets/rollback_collMod_PowerOf2Sizes.js17
-rw-r--r--src/mongo/db/repl/rs_rollback.cpp20
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;
}