diff options
Diffstat (limited to 'jstests/sharding/autosplit_heuristics.js')
-rw-r--r-- | jstests/sharding/autosplit_heuristics.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/jstests/sharding/autosplit_heuristics.js b/jstests/sharding/autosplit_heuristics.js new file mode 100644 index 00000000000..6618dd329a5 --- /dev/null +++ b/jstests/sharding/autosplit_heuristics.js @@ -0,0 +1,85 @@ +// +// Tests autosplitting heuristics, and that the heuristic counting of chunk sizes +// works as expected even after splitting. +// + +var st = new ShardingTest({ shards : 1, + mongos : 1, + other : { mongosOptions : { chunkSize : 1, verbose : 2 }}}); + +// The balancer may interfere unpredictably with the chunk moves/splits depending on timing. +st.stopBalancer(); + +// Test is not valid for debug build, heuristics get all mangled by debug reload behavior +var isDebugBuild = st.s0.getDB( "admin" ).serverBuildInfo().debug; + +if ( !isDebugBuild ) { + +var mongos = st.s0; +var config = mongos.getDB("config"); +var admin = mongos.getDB("admin"); +var coll = mongos.getCollection("foo.hashBar"); + +printjson(admin.runCommand({ enableSharding : coll.getDB() + "" })); +printjson(admin.runCommand({ shardCollection : coll + "", key : { _id : 1 } })); + +var numChunks = 10; + +// Split off the low and high chunks, to get non-special-case behavior +printjson( admin.runCommand({ split : coll + "", middle : { _id : 0 } }) ); +printjson( admin.runCommand({ split : coll + "", middle : { _id : numChunks + 1 } }) ); + +// Split all the other chunks, and an extra chunk +// We need the extra chunk to compensate for the fact that the chunk differ resets the highest +// chunk's (i.e. the last-split-chunk's) data count on reload. +for (var i = 1; i < numChunks + 1; i++) { + printjson( admin.runCommand({ split : coll + "", middle : { _id : i } }) ); +} + +jsTest.log("Setup collection..."); +st.printShardingStatus(true); + +var approxSize = Object.bsonsize({ _id : 0.0 }); + +jsTest.log("Starting inserts of approx size: " + approxSize + "..."); + +var chunkSizeBytes = 1024 * 1024; + +// We insert slightly more than the max number of docs per chunk, to test +// if resetting the chunk size happens during reloads. If the size is +// reset, we'd expect to split less, since the first split would then +// disable further splits (statistically, since the decision is randomized). +// We choose 1.4 since split attempts happen about once every 1/5 chunksize, +// and we want to be sure we def get a split attempt at a full chunk. +var insertsForSplit = Math.ceil((chunkSizeBytes * 1.4) / approxSize); +var totalInserts = insertsForSplit * numChunks; + +printjson({ chunkSizeBytes : chunkSizeBytes, + insertsForSplit : insertsForSplit, + totalInserts : totalInserts }); + +// Insert enough docs to trigger splits into all chunks +var bulk = coll.initializeUnorderedBulkOp(); +for (var i = 0; i < totalInserts; i++) { + bulk.insert({ _id : i % numChunks + (i / totalInserts) }); +} +assert.writeOK(bulk.execute()); + +jsTest.log("Inserts completed..."); + +st.printShardingStatus(true); +printjson(coll.stats()); + +// Check that all chunks (except the two extreme chunks) +// have been split at least once + 1 extra chunk as reload buffer +assert.gte(config.chunks.count(), numChunks * 2 + 3); + +jsTest.log("DONE!"); + +} +else { + jsTest.log( "Disabled test in debug builds." ); +} + +st.stop(); + |