summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2015-04-06 17:30:30 -0400
committerRamon Fernandez <ramon.fernandez@mongodb.com>2015-04-16 14:06:41 -0400
commit788d9084fc1e43a2710e3054b2ffee1574b8a479 (patch)
tree1dcec99849a60a5df26c095e0444dd7f313cd718
parentcaa254d914c7ef76b7d0ae2d46402ee2de5ef20a (diff)
downloadmongo-788d9084fc1e43a2710e3054b2ffee1574b8a479.tar.gz
SERVER-17882 Expand failIndexKeyTooLong handling to updates
(cherry picked from commit 760b3e17afda69aa224b03bddbdcc0c256a60afc)
-rw-r--r--jstests/core/index_bigkeys_nofail.js28
-rw-r--r--src/mongo/db/index/btree_based_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/btree_based_access_method.cpp b/src/mongo/db/index/btree_based_access_method.cpp
index 44e914b18a7..843253a5913 100644
--- a/src/mongo/db/index/btree_based_access_method.cpp
+++ b/src/mongo/db/index/btree_based_access_method.cpp
@@ -288,6 +288,11 @@ namespace mongo {
data->loc,
data->dupsAllowed);
if ( !status.isOK() ) {
+ if (status.code() == ErrorCodes::KeyTooLong && ignoreKeyTooLong(txn)) {
+ // Ignore.
+ continue;
+ }
+
return status;
}
}