66 lines
2.5 KiB
JavaScript
66 lines
2.5 KiB
JavaScript
/**
|
|
* Test that densify correctly limits the number of generated documents.
|
|
* @tags: [
|
|
* # Needed as $densify is a 51 feature.
|
|
* requires_fcv_51,
|
|
* ]
|
|
*/
|
|
|
|
(function() {
|
|
"use strict";
|
|
|
|
load("jstests/noPassthrough/libs/server_parameter_helpers.js"); // For setParameterOnAllHosts.
|
|
load("jstests/libs/discover_topology.js"); // For findNonConfigNodes.
|
|
|
|
const paramName = "internalQueryMaxAllowedDensifyDocs";
|
|
const origParamValue = assert.commandWorked(
|
|
db.adminCommand({getParameter: 1, internalQueryMaxAllowedDensifyDocs: 1}))[paramName];
|
|
function setMaxDocs(max) {
|
|
setParameterOnAllHosts(DiscoverTopology.findNonConfigNodes(db.getMongo()), paramName, max);
|
|
}
|
|
const coll = db[jsTestName()];
|
|
coll.drop();
|
|
|
|
function runAggregate(densifyStage, failCode = null) {
|
|
if (failCode === null) {
|
|
return db.runCommand({aggregate: coll.getName(), pipeline: [densifyStage], cursor: {}});
|
|
} else {
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({aggregate: coll.getName(), pipeline: [densifyStage], cursor: {}}),
|
|
failCode);
|
|
}
|
|
}
|
|
|
|
// Test that with explicit range and no documents we can't generate more than the limit.
|
|
setMaxDocs(10);
|
|
runAggregate({$densify: {field: "val", range: {step: 1, bounds: [0, 11]}}}, 5897900);
|
|
runAggregate({$densify: {field: "val", range: {step: 4, bounds: [0, 45]}}}, 5897900);
|
|
// Exactly ten documents should pass.
|
|
runAggregate({$densify: {field: "val", range: {step: 1, bounds: [0, 10]}}});
|
|
|
|
// Full fails if there are enough points between min and max to pass limit
|
|
assert.commandWorked(coll.insert({val: 0, part: 1}));
|
|
assert.commandWorked(coll.insert({val: 12, part: 1}));
|
|
runAggregate({$densify: {field: "val", range: {step: 1, bounds: "full"}}}, 5897900);
|
|
|
|
// Test that count is shared across partitions.
|
|
setMaxDocs(20);
|
|
assert.commandWorked(coll.insert({val: 0, part: 2}));
|
|
assert.commandWorked(coll.insert({val: 12, part: 2}));
|
|
runAggregate(
|
|
{$densify: {field: "val", partitionByFields: ["part"], range: {step: 1, bounds: "partition"}}},
|
|
5897900);
|
|
|
|
// Test that already existing documents don't count towards the limit.
|
|
coll.drop();
|
|
setMaxDocs(10);
|
|
assert.commandWorked(coll.insert({val: 0, part: 1}));
|
|
assert.commandWorked(coll.insert({val: 12, part: 1}));
|
|
runAggregate({$densify: {field: "val", range: {step: 1, bounds: "full"}}}, 5897900);
|
|
assert.commandWorked(coll.insert({val: 5, part: 1}));
|
|
runAggregate({$densify: {field: "val", range: {step: 1, bounds: "full"}}});
|
|
|
|
// Reset parameter.
|
|
setMaxDocs(origParamValue);
|
|
})();
|