summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2015-04-06 17:30:30 -0400
committerMathias Stearn <mathias@10gen.com>2015-04-09 11:35:56 -0400
commit760b3e17afda69aa224b03bddbdcc0c256a60afc (patch)
treefc34aa371de7b1b0ca9dbd00ec0cadb6321b5613
parenta7fa0b96f58d22af7b074cb6a90d16c7b71a39f2 (diff)
downloadmongo-760b3e17afda69aa224b03bddbdcc0c256a60afc.tar.gz
SERVER-17882 Expand failIndexKeyTooLong handling to updates
-rw-r--r--jstests/core/index_bigkeys_nofail.js28
-rw-r--r--src/mongo/db/index/index_access_method.cpp5
2 files changed, 31 insertions, 2 deletions
diff --git a/jstests/core/index_bigkeys_nofail.js b/jstests/core/index_bigkeys_nofail.js
index 404199679a5..5a2e407a1a2 100644
--- a/jstests/core/index_bigkeys_nofail.js
+++ b/jstests/core/index_bigkeys_nofail.js
@@ -17,9 +17,33 @@
t.drop();
db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } );
- assert.writeOK(t.insert({name:x}));
+
+ // inserts
+ assert.writeOK(t.insert({_id: 1, name:x}));
assert.commandWorked(t.ensureIndex({name:1}));
- assert.writeOK(t.insert({name:x}));
+ assert.writeOK(t.insert({_id: 2, name:x}));
+ assert.writeOK(t.insert({_id: 3, name:x}));
+ assert.eq(t.count(), 3);
+
+ // updates (smaller and larger)
+ assert.writeOK(t.update({_id: 1}, {$set:{name:'short'}}));
+ assert.writeOK(t.update({_id: 1}, {$set:{name: x}}));
+ assert.writeOK(t.update({_id: 1}, {$set:{name: x + 'even longer'}}));
+
+ // remove
+ assert.writeOK(t.remove({_id: 1}));
+ assert.eq(t.count(), 2);
+
+ db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: true } );
+
+ // can still delete even if key is oversized
+ assert.writeOK(t.remove({_id: 2}));
+ assert.eq(t.count(), 1);
+
+ // can still update to shorter, but not longer name.
+ assert.writeError(t.update({_id: 3}, {$set:{name: x + 'even longer'}}));
+ assert.writeOK(t.update({_id: 3}, {$set:{name:'short'}}));
+ assert.writeError(t.update({_id: 3}, {$set:{name: x}}));
db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: was } );
}());
diff --git a/src/mongo/db/index/index_access_method.cpp b/src/mongo/db/index/index_access_method.cpp
index 0b76b407339..b01a1eafded 100644
--- a/src/mongo/db/index/index_access_method.cpp
+++ b/src/mongo/db/index/index_access_method.cpp
@@ -317,6 +317,11 @@ namespace mongo {
ticket.loc,
ticket.dupsAllowed);
if ( !status.isOK() ) {
+ if (status.code() == ErrorCodes::KeyTooLong && ignoreKeyTooLong(txn)) {
+ // Ignore.
+ continue;
+ }
+
return status;
}
}