load('jstests/libs/parallelTester.js');
var getStringOfLength = (function() {
var cache = {};
return function(size) {
if (!cache[size]) {
cache[size] = new Array(size + 1).join('x');
}
return cache[size];
};
})();
var makeDoc = function(doc, size) {
doc.padding = '';
var paddingLength = size - Object.bsonsize(doc);
doc.padding = getStringOfLength(paddingLength);
return doc;
};
var main = function(tid) {
var prefix = 'out_agg_sort_external';
while (true) {
var toCollName = prefix + tid;
var cursor = db.source.aggregate([
{ $match: { flag: true } },
{ $sort: { rand: 1 } },
{ $out: toCollName }
], {
allowDiskUse: true
});
assert.eq(0, cursor.itcount());
assert.eq(db.source.find().itcount() / 2, db[toCollName].find().itcount());
}
};
var KB = 1024;
var MB = KB * KB;
var numDocs = 24 * KB;
var docSize = 12 * KB;
assert.lte(100 * MB, numDocs * docSize / 2);
var bulk = db.source.initializeUnorderedBulkOp();
for (var i = 0; i < numDocs; ++i) {
bulk.insert(makeDoc({
flag: i % 2 ? true : false,
rand: Random.rand()
}, docSize));
}
var res = bulk.execute();
assert.writeOK(res);
assert.eq(numDocs, res.nInserted);
var numThreads = 10;
i = 0;
for (; i < numThreads - 1; ++i) {
var t = new ScopedThread(main, i);
t.start();
}
main(i);