78 lines
2.7 KiB
JavaScript
78 lines
2.7 KiB
JavaScript
// server-9444 support disk storage of intermediate results in aggregation
|
|
|
|
var t = db.server9444;
|
|
t.drop();
|
|
|
|
var sharded = (typeof(RUNNING_IN_SHARDED_AGG_TEST) != 'undefined'); // see end of testshard1.js
|
|
if (sharded) {
|
|
db.adminCommand( { shardcollection : t.getFullName(), key : { "_id" : 'hashed' } } );
|
|
}
|
|
|
|
var memoryLimitMB = sharded ? 200 : 100;
|
|
|
|
function loadData() {
|
|
var bigStr = Array(1024*1024 + 1).toString(); // 1MB of ','
|
|
for (var i = 0; i < memoryLimitMB + 1; i++)
|
|
t.insert({_id: i, bigStr: i + bigStr, random: Math.random()});
|
|
|
|
assert.gt(t.stats().size, memoryLimitMB * 1024*1024);
|
|
}
|
|
loadData();
|
|
|
|
function test(pipeline, outOfMemoryCode) {
|
|
// ensure by default we error out if exceeding memory limit
|
|
var res = t.runCommand('aggregate', {pipeline: pipeline});
|
|
assert.commandFailed(res);
|
|
assert.eq(res.code, outOfMemoryCode);
|
|
|
|
// ensure allowDiskUse: false does what it says
|
|
var res = t.runCommand('aggregate', {pipeline: pipeline, allowDiskUse: false});
|
|
assert.commandFailed(res);
|
|
assert.eq(res.code, outOfMemoryCode);
|
|
|
|
// allowDiskUse only supports bool. In particular, numbers aren't allowed.
|
|
var res = t.runCommand('aggregate', {pipeline: pipeline, allowDiskUse: 1});
|
|
assert.commandFailed(res);
|
|
assert.eq(res.code, 16949);
|
|
|
|
// ensure we work when allowDiskUse === true
|
|
var res = t.aggregate(pipeline, {allowDiskUse: true});
|
|
assert.eq(res.itcount(), t.count()); // all tests output one doc per input doc
|
|
}
|
|
|
|
var groupCode = 16945;
|
|
var sortCode = 16819;
|
|
var sortLimitCode = 16820;
|
|
|
|
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}], groupCode);
|
|
|
|
// sorting with _id would use index which doesn't require extsort
|
|
test([{$sort: {random: 1}}], sortCode);
|
|
test([{$sort: {bigStr: 1}}], sortCode); // big key and value
|
|
|
|
// make sure sort + large limit won't crash the server (SERVER-10136)
|
|
test([{$sort: {bigStr: 1}}, {$limit:1000*1000*1000}], sortLimitCode);
|
|
|
|
// test combining two extSorts in both same and different orders
|
|
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {_id:1}}], groupCode);
|
|
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {_id:-1}}], groupCode);
|
|
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {random:1}}], groupCode);
|
|
test([{$sort: {random:1}}, {$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}], sortCode);
|
|
|
|
var origDB = db;
|
|
if (sharded) {
|
|
// Stop balancer first before dropping so there will be no contention on the ns lock.
|
|
// It's alright to modify the global db variable since sharding tests never run in parallel.
|
|
db = db.getSiblingDB('config');
|
|
sh.stopBalancer();
|
|
}
|
|
|
|
// don't leave large collection laying around
|
|
t.drop();
|
|
|
|
if (sharded) {
|
|
sh.startBalancer();
|
|
db = origDB;
|
|
}
|
|
|