diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2016-01-15 15:10:24 -0500 |
---|---|---|
committer | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2016-01-15 15:10:24 -0500 |
commit | 64a7daba1746dcda0f7d25eab82d35e2c093d54f (patch) | |
tree | 62df0fbaf6f59de54635eb0544edfe33ab8794c4 /jstests/core/mr_bigobject_replace.js | |
parent | fd07c9285b29814d95547dce30f97c06868a973b (diff) | |
download | mongo-64a7daba1746dcda0f7d25eab82d35e2c093d54f.tar.gz |
SERVER-21863 Prevent map-reduce from inserting >16MB documents.
Diffstat (limited to 'jstests/core/mr_bigobject_replace.js')
-rw-r--r-- | jstests/core/mr_bigobject_replace.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/jstests/core/mr_bigobject_replace.js b/jstests/core/mr_bigobject_replace.js new file mode 100644 index 00000000000..dbed4664e7a --- /dev/null +++ b/jstests/core/mr_bigobject_replace.js @@ -0,0 +1,54 @@ +/** + * Test that the server returns an error response for map-reduce operations that attempt to insert a + * document larger than 16MB as a result of the reduce() or finalize() functions and using the + * "replace" action for the out collection. + */ +(function() { + function mapper() { + // Emit multiple values to ensure that the reducer gets called. + emit(this._id, 1); + emit(this._id, 1); + } + + function createBigDocument() { + // Returns a document of the form { _id: ObjectId(...), value: '...' } with the specified + // 'targetSize' in bytes. + function makeDocWithSize(targetSize) { + var doc = {_id: new ObjectId(), value: ''}; + + var size = Object.bsonsize(doc); + assert.gte(targetSize, size); + + // Set 'value' as a string with enough characters to make the whole document 'size' + // bytes long. + doc.value = new Array(targetSize - size + 1).join('x'); + assert.eq(targetSize, Object.bsonsize(doc)); + + return doc; + } + + var maxDocSize = 16 * 1024 * 1024; + return makeDocWithSize(maxDocSize + 1).value; + } + + function runTest(testOptions) { + db.input.drop(); + db.mr_bigobject_replace.drop(); + + // Insert a document so the mapper gets run. + assert.writeOK(db.input.insert({})); + + var res = db.runCommand(Object.extend({ + mapReduce: "input", + map: mapper, + out: {replace: "mr_bigobject_replace"}, + }, testOptions)); + + assert.commandFailed(res, "creating a document larger than 16MB didn't fail"); + assert.lte(0, res.errmsg.indexOf("object to insert too large"), + "map-reduce command failed for a reason other than inserting a large document"); + } + + runTest({reduce: createBigDocument}); + runTest({reduce: function() { return 1; }, finalize: createBigDocument}); +})(); |