summaryrefslogtreecommitdiff
path: root/jstests/core/mr_bigobject_replace.js
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2016-01-15 15:10:24 -0500
committerMax Hirschhorn <max.hirschhorn@mongodb.com>2016-01-15 15:10:24 -0500
commit64a7daba1746dcda0f7d25eab82d35e2c093d54f (patch)
tree62df0fbaf6f59de54635eb0544edfe33ab8794c4 /jstests/core/mr_bigobject_replace.js
parentfd07c9285b29814d95547dce30f97c06868a973b (diff)
downloadmongo-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.js54
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});
+})();