summaryrefslogtreecommitdiff
path: root/jstests/sharding
diff options
context:
space:
mode:
authorIan Boros <ian.boros@mongodb.com>2020-07-10 12:41:00 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-07-27 17:31:01 +0000
commitc1f940d3d2d65fabfb1a4b536aeaff58d6e0ec53 (patch)
treeec0ed26cb08e59f34bdacc72167876865749d3d2 /jstests/sharding
parent6086feae0b0f38bd14bbc8521c4115982433ae9e (diff)
downloadmongo-c1f940d3d2d65fabfb1a4b536aeaff58d6e0ec53.tar.gz
SERVER-48963 Make max_time_ms_sharded.js more robust
Diffstat (limited to 'jstests/sharding')
-rw-r--r--jstests/sharding/max_time_ms_sharded.js270
1 files changed, 0 insertions, 270 deletions
diff --git a/jstests/sharding/max_time_ms_sharded.js b/jstests/sharding/max_time_ms_sharded.js
deleted file mode 100644
index 8579149cb36..00000000000
--- a/jstests/sharding/max_time_ms_sharded.js
+++ /dev/null
@@ -1,270 +0,0 @@
-// Test mongos implementation of time-limited operations: verify that mongos correctly forwards max
-// time to shards, and that mongos correctly times out max time sharded getmore operations (which
-// are run in series on shards).
-//
-// Note that mongos does not time out commands or query ops (which remains responsibility of mongod,
-// pending development of an interrupt framework for mongos).
-(function() {
-'use strict';
-
-var st = new ShardingTest({shards: 2});
-
-var mongos = st.s0;
-var shards = [st.shard0, st.shard1];
-var coll = mongos.getCollection("foo.bar");
-var admin = mongos.getDB("admin");
-var cursor;
-var res;
-
-// Helper function to configure "maxTimeAlwaysTimeOut" fail point on shards, which forces mongod
-// to throw if it receives an operation with a max time. See fail point declaration for complete
-// description.
-var configureMaxTimeAlwaysTimeOut = function(mode) {
- assert.commandWorked(shards[0].getDB("admin").runCommand(
- {configureFailPoint: "maxTimeAlwaysTimeOut", mode: mode}));
- assert.commandWorked(shards[1].getDB("admin").runCommand(
- {configureFailPoint: "maxTimeAlwaysTimeOut", mode: mode}));
-};
-
-// Helper function to configure "maxTimeAlwaysTimeOut" fail point on shards, which prohibits
-// mongod from enforcing time limits. See fail point declaration for complete description.
-var configureMaxTimeNeverTimeOut = function(mode) {
- assert.commandWorked(shards[0].getDB("admin").runCommand(
- {configureFailPoint: "maxTimeNeverTimeOut", mode: mode}));
- assert.commandWorked(shards[1].getDB("admin").runCommand(
- {configureFailPoint: "maxTimeNeverTimeOut", mode: mode}));
-};
-
-//
-// Pre-split collection: shard 0 takes {_id: {$lt: 0}}, shard 1 takes {_id: {$gte: 0}}.
-//
-assert.commandWorked(admin.runCommand({enableSharding: coll.getDB().getName()}));
-st.ensurePrimaryShard(coll.getDB().toString(), st.shard0.shardName);
-assert.commandWorked(admin.runCommand({shardCollection: coll.getFullName(), key: {_id: 1}}));
-assert.commandWorked(admin.runCommand({split: coll.getFullName(), middle: {_id: 0}}));
-assert.commandWorked(
- admin.runCommand({moveChunk: coll.getFullName(), find: {_id: 0}, to: st.shard1.shardName}));
-
-//
-// Insert 1000 documents into sharded collection, such that each shard owns 500.
-//
-const nDocsPerShard = 500;
-var bulk = coll.initializeUnorderedBulkOp();
-for (var i = -nDocsPerShard; i < nDocsPerShard; i++) {
- bulk.insert({_id: i});
-}
-assert.commandWorked(bulk.execute());
-assert.eq(nDocsPerShard, shards[0].getCollection(coll.getFullName()).count());
-assert.eq(nDocsPerShard, shards[1].getCollection(coll.getFullName()).count());
-
-//
-// Test that mongos correctly forwards max time to shards for sharded queries. Uses
-// maxTimeAlwaysTimeOut to ensure mongod throws if it receives a max time.
-//
-
-// Positive test.
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-cursor = coll.find();
-cursor.maxTimeMS(60 * 1000);
-assert.throws(function() {
- cursor.next();
-}, [], "expected query to fail in mongod due to maxTimeAlwaysTimeOut fail point");
-
-// Negative test.
-configureMaxTimeAlwaysTimeOut("off");
-cursor = coll.find();
-cursor.maxTimeMS(60 * 1000);
-assert.doesNotThrow(function() {
- cursor.next();
-}, [], "expected query to not hit time limit in mongod");
-
-//
-// Test that mongos correctly times out max time sharded getmore operations. Uses
-// maxTimeNeverTimeOut to ensure mongod doesn't enforce a time limit.
-//
-
-configureMaxTimeNeverTimeOut("alwaysOn");
-
-// Positive test. ~10s operation, 2s limit. The operation takes ~10s because each shard
-// processes 250 batches of ~40ms each, and the shards are processing getMores in parallel.
-cursor = coll.find({
- $where: function() {
- sleep(20);
- return true;
- }
-});
-cursor.batchSize(2);
-cursor.maxTimeMS(2 * 1000);
-assert.doesNotThrow(
- () => cursor.next(), [], "did not expect mongos to time out first batch of query");
-assert.throws(() => cursor.itcount(), [], "expected mongos to abort getmore due to time limit");
-
-// Negative test. ~5s operation, with a high (1-day) limit.
-cursor = coll.find({
- $where: function() {
- sleep(10);
- return true;
- }
-});
-cursor.batchSize(2);
-cursor.maxTimeMS(1000 * 60 * 60 * 24);
-assert.doesNotThrow(function() {
- cursor.next();
-}, [], "did not expect mongos to time out first batch of query");
-assert.doesNotThrow(function() {
- cursor.itcount();
-}, [], "did not expect getmore ops to hit the time limit");
-
-configureMaxTimeNeverTimeOut("off");
-
-//
-// Test that mongos correctly forwards max time to shards for sharded commands. Uses
-// maxTimeAlwaysTimeOut to ensure mongod throws if it receives a max time.
-//
-
-// Positive test for "validate".
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-assert.commandFailedWithCode(
- coll.runCommand("validate", {maxTimeMS: 60 * 1000}),
- ErrorCodes.MaxTimeMSExpired,
- "expected vailidate to fail with code " + ErrorCodes.MaxTimeMSExpired +
- " due to maxTimeAlwaysTimeOut fail point, but instead got: " + tojson(res));
-
-// Negative test for "validate".
-configureMaxTimeAlwaysTimeOut("off");
-assert.commandWorked(coll.runCommand("validate", {maxTimeMS: 60 * 1000}),
- "expected validate to not hit time limit in mongod");
-
-// Positive test for "count".
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-assert.commandFailedWithCode(
- coll.runCommand("count", {maxTimeMS: 60 * 1000}),
- ErrorCodes.MaxTimeMSExpired,
- "expected count to fail with code " + ErrorCodes.MaxTimeMSExpired +
- " due to maxTimeAlwaysTimeOut fail point, but instead got: " + tojson(res));
-
-// Negative test for "count".
-configureMaxTimeAlwaysTimeOut("off");
-assert.commandWorked(coll.runCommand("count", {maxTimeMS: 60 * 1000}),
- "expected count to not hit time limit in mongod");
-
-// Positive test for "collStats".
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-assert.commandFailedWithCode(
- coll.runCommand("collStats", {maxTimeMS: 60 * 1000}),
- ErrorCodes.MaxTimeMSExpired,
- "expected collStats to fail with code " + ErrorCodes.MaxTimeMSExpired +
- " due to maxTimeAlwaysTimeOut fail point, but instead got: " + tojson(res));
-
-// Negative test for "collStats".
-configureMaxTimeAlwaysTimeOut("off");
-assert.commandWorked(coll.runCommand("collStats", {maxTimeMS: 60 * 1000}),
- "expected collStats to not hit time limit in mongod");
-
-// Positive test for "mapReduce".
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-res = coll.runCommand("mapReduce", {
- map: function() {
- emit(0, 0);
- },
- reduce: function(key, values) {
- return 0;
- },
- out: {inline: 1},
- maxTimeMS: 60 * 1000
-});
-assert.commandFailedWithCode(
- res,
- ErrorCodes.MaxTimeMSExpired,
- "expected mapReduce to fail with code " + ErrorCodes.MaxTimeMSExpired +
- " due to maxTimeAlwaysTimeOut fail point, but instead got: " + tojson(res));
-
-// Negative test for "mapReduce".
-configureMaxTimeAlwaysTimeOut("off");
-assert.commandWorked(coll.runCommand("mapReduce", {
- map: function() {
- emit(0, 0);
- },
- reduce: function(key, values) {
- return 0;
- },
- out: {inline: 1},
- maxTimeMS: 60 * 1000
-}),
- "expected mapReduce to not hit time limit in mongod");
-
-// Positive test for "aggregate".
-configureMaxTimeAlwaysTimeOut("alwaysOn");
-assert.commandFailedWithCode(
- coll.runCommand("aggregate", {pipeline: [], cursor: {}, maxTimeMS: 60 * 1000}),
- ErrorCodes.MaxTimeMSExpired,
- "expected aggregate to fail with code " + ErrorCodes.MaxTimeMSExpired +
- " due to maxTimeAlwaysTimeOut fail point, but instead got: " + tojson(res));
-
-// Negative test for "aggregate".
-configureMaxTimeAlwaysTimeOut("off");
-assert.commandWorked(coll.runCommand("aggregate", {pipeline: [], cursor: {}, maxTimeMS: 60 * 1000}),
- "expected aggregate to not hit time limit in mongod");
-
-// Test that the maxTimeMS is still enforced on the shards even if we do not spend much time in
-// mongos blocking.
-
-// Manually run a find here so we can be sure cursor establishment happens with batch size 0.
-res = assert.commandWorked(coll.runCommand({
- find: coll.getName(),
- filter: {
- $where: function() {
- if (this._id < 0) {
- // Slow down the query only on one of the shards. Each shard has 500 documents
- // so we expect this shard to take ~10 seconds to return a batch of 500.
- sleep(20);
- }
- return true;
- }
- },
- maxTimeMS: 2000,
- batchSize: 0
-}));
-// Use a batch size of 500 to allow returning results from the fast shard as soon as they're
-// ready, as opposed to waiting to return one 16MB batch at a time.
-const kBatchSize = nDocsPerShard;
-cursor = new DBCommandCursor(coll.getDB(), res, kBatchSize);
-// The fast shard should return relatively quickly.
-for (let i = 0; i < nDocsPerShard; ++i) {
- let next = assert.doesNotThrow(
- () => cursor.next(), [], "did not expect mongos to time out first batch of query");
- assert.gte(next._id, 0);
-}
-// Sleep on the client-side so mongos's time budget is not being used.
-sleep(3 * 1000);
-// Even though mongos has not been blocking this whole time, the shard has been busy computing
-// the next batch and should have timed out.
-assert.throws(() => cursor.next(), [], "expected mongos to abort getMore due to time limit");
-
-// The moveChunk tests are disabled due to SERVER-30179
-//
-// // Positive test for "moveChunk".
-// configureMaxTimeAlwaysTimeOut("alwaysOn");
-// res = admin.runCommand({
-// moveChunk: coll.getFullName(),
-// find: {_id: 0},
-// to: st.shard0.shardName,
-// maxTimeMS: 1000 * 60 * 60 * 24
-// });
-// assert.commandFailed(
-// res,
-// "expected moveChunk to fail due to maxTimeAlwaysTimeOut fail point, but instead got: " +
-// tojson(res));
-
-// // Negative test for "moveChunk".
-// configureMaxTimeAlwaysTimeOut("off");
-// assert.commandWorked(admin.runCommand({
-// moveChunk: coll.getFullName(),
-// find: {_id: 0},
-// to: st.shard0.shardName,
-// maxTimeMS: 1000 * 60 * 60 * 24
-// }),
-// "expected moveChunk to not hit time limit in mongod");
-
-st.stop();
-})();