This is just a cleanup work to hide some of the private state of ReplSetTest so it is easier to encapsulate and add new logic. Also enables strict mode.
61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
// Ensures that single mongos shard-key errors are fast, but slow down when many are triggered
|
|
(function() {
|
|
'use strict';
|
|
|
|
var st = new ShardingTest({ shards : 1, mongos : 1 });
|
|
|
|
var mongos = st.s0;
|
|
var admin = mongos.getDB("admin");
|
|
var coll = mongos.getCollection("foo.bar");
|
|
|
|
assert.commandWorked(admin.runCommand({ enableSharding : coll.getDB() + "" }));
|
|
|
|
coll.ensureIndex({ shardKey : 1 });
|
|
assert.commandWorked(admin.runCommand({ shardCollection : coll + "", key : { shardKey : 1 } }));
|
|
|
|
var timeBadInsert = function() {
|
|
var start = new Date().getTime();
|
|
|
|
// Bad insert, no shard key
|
|
assert.writeError(coll.insert({ hello : "world" }));
|
|
|
|
var end = new Date().getTime();
|
|
|
|
return end - start;
|
|
}
|
|
|
|
// We need to work at least twice in order to check resetting the counter
|
|
var successNeeded = 2;
|
|
var success = 0;
|
|
|
|
// Loop over this test a few times, to ensure that the error counters get reset if we don't have
|
|
// bad inserts over a long enough time.
|
|
for (var test = 0; test < 5; test++) {
|
|
var firstWait = timeBadInsert();
|
|
var lastWait = 0;
|
|
|
|
for(var i = 0; i < 20; i++) {
|
|
printjson(lastWait = timeBadInsert());
|
|
}
|
|
|
|
// As a heuristic test, we want to make sure that the error wait after sleeping is much less
|
|
// than the error wait after a lot of errors.
|
|
if (lastWait > firstWait * 2 * 2) {
|
|
success++;
|
|
}
|
|
|
|
if (success >= successNeeded) {
|
|
break;
|
|
}
|
|
|
|
// Abort if we've failed too many times
|
|
assert.lt(test, 4);
|
|
|
|
// Sleeping for long enough to reset our exponential counter
|
|
sleep(3000);
|
|
}
|
|
|
|
st.stop();
|
|
|
|
})();
|