diff options
author | Mathias Stearn <mathias@10gen.com> | 2015-04-06 17:30:30 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2015-04-09 11:35:56 -0400 |
commit | 760b3e17afda69aa224b03bddbdcc0c256a60afc (patch) | |
tree | fc34aa371de7b1b0ca9dbd00ec0cadb6321b5613 | |
parent | a7fa0b96f58d22af7b074cb6a90d16c7b71a39f2 (diff) | |
download | mongo-760b3e17afda69aa224b03bddbdcc0c256a60afc.tar.gz |
SERVER-17882 Expand failIndexKeyTooLong handling to updates
-rw-r--r-- | jstests/core/index_bigkeys_nofail.js | 28 | ||||
-rw-r--r-- | src/mongo/db/index/index_access_method.cpp | 5 |
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; } } |