summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2017-11-16 14:37:20 -0500
committerGeert Bosch <geert@mongodb.com>2018-01-03 12:54:44 -0500
commit960c883bf7ef7b7f0f72fc99f79b0fb110006e55 (patch)
tree08c5223deb86076e644507a5d1a1d829e04358e0
parent707f2e26f01bc9fa126877a275486f80f58ab004 (diff)
downloadmongo-960c883bf7ef7b7f0f72fc99f79b0fb110006e55.tar.gz
SERVER-32001 Fix unindexing of rollback in unique partial indexes
(cherry picked from commit 07bfb1286cb6d01d8080ab3b39a1c76dd123e002)
-rw-r--r--jstests/noPassthrough/partial_unique_indexes.js47
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp1
2 files changed, 48 insertions, 0 deletions
diff --git a/jstests/noPassthrough/partial_unique_indexes.js b/jstests/noPassthrough/partial_unique_indexes.js
new file mode 100644
index 00000000000..7c376872ade
--- /dev/null
+++ b/jstests/noPassthrough/partial_unique_indexes.js
@@ -0,0 +1,47 @@
+/**
+ * SERVER-32001: Test that indexing paths for non-unique, partial, unique, partial&unique
+ * crud operations correctly handle WriteConflictExceptions.
+ */
+(function() {
+ "strict";
+
+ let conn = MongoRunner.runMongod();
+ let testDB = conn.getDB("test");
+
+ let t = testDB.jstests_parallel_allops;
+ t.drop();
+
+ t.createIndex({x: 1, _id: 1}, {partialFilterExpression: {_id: {$lt: 500}}, unique: true});
+ t.createIndex({y: -1, _id: 1}, {unique: true});
+ t.createIndex({x: -1}, {partialFilterExpression: {_id: {$gte: 500}}, unique: false});
+ t.createIndex({y: 1}, {unique: false});
+
+ let _id = {"#RAND_INT": [0, 1000]};
+ let ops = [
+ {op: "remove", ns: t.getFullName(), query: {_id}},
+ {op: "update", ns: t.getFullName(), query: {_id}, update: {$inc: {x: 1}}, upsert: true},
+ {op: "update", ns: t.getFullName(), query: {_id}, update: {$inc: {y: 1}}, upsert: true},
+ ];
+
+ let seconds = 5;
+ let parallel = 5;
+ let host = testDB.getMongo().host;
+
+ let benchArgs = {ops, seconds, parallel, host};
+
+ assert.commandWorked(testDB.adminCommand({
+ configureFailPoint: 'WTWriteConflictExceptionForReads',
+ mode: {activationProbability: 0.01}
+ }));
+ assert.commandWorked(testDB.adminCommand(
+ {configureFailPoint: 'WTWriteConflictException', mode: {activationProbability: 0.01}}));
+ res = benchRun(benchArgs);
+ printjson({res});
+
+ assert.commandWorked(
+ testDB.adminCommand({configureFailPoint: 'WTWriteConflictException', mode: "off"}));
+ assert.commandWorked(
+ testDB.adminCommand({configureFailPoint: 'WTWriteConflictExceptionForReads', mode: "off"}));
+ res = t.validate();
+ assert(res.valid, tojson(res));
+})();
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
index 6331594a57c..ecf3c183996 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
@@ -1102,6 +1102,7 @@ void WiredTigerIndexUnique::_unindex(WT_CURSOR* c,
triggerWriteConflictAtPoint(c);
return;
}
+ invariantWTOK(ret);
WT_ITEM value;
invariantWTOK(c->get_value(c, &value));
BufReader br(value.data, value.size);