diff options
Diffstat (limited to 'jstests/sharding/printShardingStatus.js')
-rw-r--r-- | jstests/sharding/printShardingStatus.js | 422 |
1 files changed, 208 insertions, 214 deletions
diff --git a/jstests/sharding/printShardingStatus.js b/jstests/sharding/printShardingStatus.js index 2bac7da381a..05e6eca0d4f 100644 --- a/jstests/sharding/printShardingStatus.js +++ b/jstests/sharding/printShardingStatus.js @@ -2,242 +2,236 @@ // contains important information that it should, like the major section // headings and the names of sharded collections and their shard keys. +(function() { -(function () { + var st = new ShardingTest({shards: 1, mongos: 2, config: 1, other: {smallfiles: true}}); + var mongos = st.s0; + var admin = mongos.getDB("admin"); -var st = new ShardingTest({ shards: 1, mongos: 2, config: 1, other: { smallfiles: true } }); - -var mongos = st.s0; -var admin = mongos.getDB( "admin" ); - - -function grabStatusOutput(configdb, verbose) { - var res = print.captureAllOutput( function () { + function grabStatusOutput(configdb, verbose) { + var res = print.captureAllOutput(function() { return printShardingStatus(configdb, verbose); - } ); - var output = res.output.join("\n"); - jsTestLog(output); - return output; -} - -function assertPresentInOutput(output, content, what) { - assert(output.includes(content), what + " \"" + content + "\" NOT present in output of " - + "printShardingStatus() (but it should be)"); -} - -function assertNotPresentInOutput(output, content, what) { - assert( ! output.includes(content), what + " \"" + content + "\" IS present in output of " - + "printShardingStatus() (but it should not be)"); -} - - - -//////////////////////// -// Basic tests -//////////////////////// - -var dbName = "thisIsTheDatabase"; -var collName = "thisIsTheCollection"; -var shardKeyName = "thisIsTheShardKey"; -var nsName = dbName + "." + collName; - -assert.commandWorked( admin.runCommand({ enableSharding: dbName }) ); -var key = {}; -key[shardKeyName] = 1; -assert.commandWorked( admin.runCommand({ shardCollection: nsName, key: key }) ); - - -function testBasic(output) { - assertPresentInOutput(output, "shards:", "section header"); - assertPresentInOutput(output, "databases:", "section header"); - assertPresentInOutput(output, "balancer:", "section header"); - assertPresentInOutput(output, "active mongoses:", "section header"); - assertNotPresentInOutput(output, "most recently active mongoses:", "section header"); - - assertPresentInOutput(output, dbName, "database"); - assertPresentInOutput(output, collName, "collection"); - assertPresentInOutput(output, shardKeyName, "shard key"); -} - -function testBasicNormalOnly(output) { - assertPresentInOutput(output, tojson(version) + " : 2\n", "active mongos version"); -} - -function testBasicVerboseOnly(output) { - assertPresentInOutput(output, '"mongoVersion" : ' + tojson(version), "active mongos version"); - assertPresentInOutput(output, '"_id" : ' + tojson(s1Host), "active mongos hostname"); - assertPresentInOutput(output, '"_id" : ' + tojson(s2Host), "active mongos hostname"); -} - -var buildinfo = assert.commandWorked( mongos.adminCommand("buildinfo") ); -var serverStatus1 = assert.commandWorked( mongos.adminCommand("serverStatus") ); -var serverStatus2 = assert.commandWorked( st.s1.adminCommand("serverStatus") ); -var version = buildinfo.version; -var s1Host = serverStatus1.host; -var s2Host = serverStatus2.host; - - -// Normal, active mongoses -var outputNormal = grabStatusOutput(st.config, false); -testBasic(outputNormal); -testBasicNormalOnly(outputNormal); - -var outputVerbose = grabStatusOutput(st.config, true); -testBasic(outputVerbose); -testBasicVerboseOnly(outputVerbose); - - -// Take a copy of the config db, in order to test the harder-to-setup cases below. -// TODO: Replace this manual copy with copydb once SERVER-13080 is fixed. -var config = mongos.getDB("config"); -var configCopy = mongos.getDB("configCopy"); -config.getCollectionInfos().forEach( function (c) { - // Create collection with options. - assert.commandWorked( configCopy.createCollection(c.name, c.options) ); - // Clone the docs. - config.getCollection(c.name).find().snapshot().forEach( function (d) { - assert.writeOK( configCopy.getCollection(c.name).insert(d) ); - } ); - // Build the indexes. - config.getCollection(c.name).getIndexes().forEach( function (i) { - var key = i.key; - delete i.key; - delete i.ns; - delete i.v; - assert.commandWorked( configCopy.getCollection(c.name).ensureIndex(key, i) ); - } ); -} ); - - -// Inactive mongoses -// Make the first ping be older than now by 1 second more than the threshold -// Make the second ping be older still by the same amount again -var pingAdjustMs = 60000 + 1000; -var then = new Date(); -then.setTime(then.getTime() - pingAdjustMs); -configCopy.mongos.update( { _id: s1Host }, { $set: { ping: then } } ); -then.setTime(then.getTime() - pingAdjustMs); -configCopy.mongos.update( { _id: s2Host }, { $set: { ping: then } } ); - -var output = grabStatusOutput(configCopy, false); -assertPresentInOutput(output, "most recently active mongoses:", "section header"); -assertPresentInOutput(output, tojson(version) + " : 1\n", "recent mongos version"); - -var output = grabStatusOutput(configCopy, true); -assertPresentInOutput(output, "most recently active mongoses:", "section header"); -assertPresentInOutput(output, '"_id" : ' + tojson(s1Host), "recent mongos hostname"); -assertNotPresentInOutput(output, '"_id" : ' + tojson(s2Host), "old mongos hostname"); - - -// Older mongoses -configCopy.mongos.remove( { _id: s1Host } ); - -var output = grabStatusOutput(configCopy, false); -assertPresentInOutput(output, "most recently active mongoses:", "section header"); -assertPresentInOutput(output, tojson(version) + " : 1\n", "recent mongos version"); - -var output = grabStatusOutput(configCopy, true); -assertPresentInOutput(output, "most recently active mongoses:", "section header"); -assertNotPresentInOutput(output, '"_id" : ' + tojson(s1Host), "removed mongos hostname"); -assertPresentInOutput(output, '"_id" : ' + tojson(s2Host), "recent mongos hostname"); - - -// No mongoses at all -configCopy.mongos.remove({}); - -var output = grabStatusOutput(configCopy, false); -assertPresentInOutput(output, "most recently active mongoses:\n\tnone", "no mongoses"); - -var output = grabStatusOutput(configCopy, true); -assertPresentInOutput(output, "most recently active mongoses:\n\tnone", "no mongoses (verbose)"); - - -assert( mongos.getDB(dbName).dropDatabase() ); - - - -//////////////////////// -// Extended tests -//////////////////////// - -var testCollDetailsNum = 0; -function testCollDetails(args) { - if (args === undefined || typeof(args) != "object") { - args = {}; + }); + var output = res.output.join("\n"); + jsTestLog(output); + return output; } - var getCollName = function (x) { return "test.test" + x.zeroPad(4); }; - var collName = getCollName(testCollDetailsNum); - - var cmdObj = { shardCollection: collName, key: { _id: 1 } }; - if (args.unique) { - cmdObj.unique = true; + function assertPresentInOutput(output, content, what) { + assert(output.includes(content), + what + " \"" + content + "\" NOT present in output of " + + "printShardingStatus() (but it should be)"); } - assert.commandWorked( admin.runCommand(cmdObj) ); - if (args.hasOwnProperty("unique")) { - assert.writeOK( mongos.getDB("config").collections.update({ _id : collName }, - { $set : { "unique" : args.unique } }) ); - } - if (args.hasOwnProperty("noBalance")) { - assert.writeOK( mongos.getDB("config").collections.update({ _id : collName }, - { $set : { "noBalance" : args.noBalance } }) ); + function assertNotPresentInOutput(output, content, what) { + assert(!output.includes(content), + what + " \"" + content + "\" IS present in output of " + + "printShardingStatus() (but it should not be)"); } - var output = grabStatusOutput(st.config); - - assertPresentInOutput(output, collName, "collection"); - // If any of the previous collection names are present, then their optional indicators - // might also be present. This might taint the results when we go searching through - // the output. - // This also means that earlier collNames can't be a prefix of later collNames. - for (var i = 0; i < testCollDetailsNum; i++) { - assertNotPresentInOutput(output, getCollName(i), "previous collection"); + //////////////////////// + // Basic tests + //////////////////////// + + var dbName = "thisIsTheDatabase"; + var collName = "thisIsTheCollection"; + var shardKeyName = "thisIsTheShardKey"; + var nsName = dbName + "." + collName; + + assert.commandWorked(admin.runCommand({enableSharding: dbName})); + var key = {}; + key[shardKeyName] = 1; + assert.commandWorked(admin.runCommand({shardCollection: nsName, key: key})); + + function testBasic(output) { + assertPresentInOutput(output, "shards:", "section header"); + assertPresentInOutput(output, "databases:", "section header"); + assertPresentInOutput(output, "balancer:", "section header"); + assertPresentInOutput(output, "active mongoses:", "section header"); + assertNotPresentInOutput(output, "most recently active mongoses:", "section header"); + + assertPresentInOutput(output, dbName, "database"); + assertPresentInOutput(output, collName, "collection"); + assertPresentInOutput(output, shardKeyName, "shard key"); } - assertPresentInOutput(output, "unique: " + (!!args.unique), "unique shard key indicator"); - if (args.hasOwnProperty("unique") && typeof(args.unique) != "boolean") { - // non-bool: actual value must be shown - assertPresentInOutput(output, tojson(args.unique), "unique shard key indicator (non bool)"); + function testBasicNormalOnly(output) { + assertPresentInOutput(output, tojson(version) + " : 2\n", "active mongos version"); } - assertPresentInOutput(output, - "balancing: " + (!args.noBalance), - "balancing indicator (inverse of noBalance)"); - if (args.hasOwnProperty("noBalance") && typeof(args.noBalance) != "boolean") { - // non-bool: actual value must be shown - assertPresentInOutput(output, tojson(args.noBalance), "noBalance indicator (non bool)"); + function testBasicVerboseOnly(output) { + assertPresentInOutput( + output, '"mongoVersion" : ' + tojson(version), "active mongos version"); + assertPresentInOutput(output, '"_id" : ' + tojson(s1Host), "active mongos hostname"); + assertPresentInOutput(output, '"_id" : ' + tojson(s2Host), "active mongos hostname"); } - assert( mongos.getCollection(collName).drop() ); - - testCollDetailsNum++; -} - -assert.commandWorked( admin.runCommand({ enableSharding: "test" }) ); - -// Defaults -testCollDetails({ }); + var buildinfo = assert.commandWorked(mongos.adminCommand("buildinfo")); + var serverStatus1 = assert.commandWorked(mongos.adminCommand("serverStatus")); + var serverStatus2 = assert.commandWorked(st.s1.adminCommand("serverStatus")); + var version = buildinfo.version; + var s1Host = serverStatus1.host; + var s2Host = serverStatus2.host; + + // Normal, active mongoses + var outputNormal = grabStatusOutput(st.config, false); + testBasic(outputNormal); + testBasicNormalOnly(outputNormal); + + var outputVerbose = grabStatusOutput(st.config, true); + testBasic(outputVerbose); + testBasicVerboseOnly(outputVerbose); + + // Take a copy of the config db, in order to test the harder-to-setup cases below. + // TODO: Replace this manual copy with copydb once SERVER-13080 is fixed. + var config = mongos.getDB("config"); + var configCopy = mongos.getDB("configCopy"); + config.getCollectionInfos().forEach(function(c) { + // Create collection with options. + assert.commandWorked(configCopy.createCollection(c.name, c.options)); + // Clone the docs. + config.getCollection(c.name).find().snapshot().forEach(function(d) { + assert.writeOK(configCopy.getCollection(c.name).insert(d)); + }); + // Build the indexes. + config.getCollection(c.name).getIndexes().forEach(function(i) { + var key = i.key; + delete i.key; + delete i.ns; + delete i.v; + assert.commandWorked(configCopy.getCollection(c.name).ensureIndex(key, i)); + }); + }); + + // Inactive mongoses + // Make the first ping be older than now by 1 second more than the threshold + // Make the second ping be older still by the same amount again + var pingAdjustMs = 60000 + 1000; + var then = new Date(); + then.setTime(then.getTime() - pingAdjustMs); + configCopy.mongos.update({_id: s1Host}, {$set: {ping: then}}); + then.setTime(then.getTime() - pingAdjustMs); + configCopy.mongos.update({_id: s2Host}, {$set: {ping: then}}); + + var output = grabStatusOutput(configCopy, false); + assertPresentInOutput(output, "most recently active mongoses:", "section header"); + assertPresentInOutput(output, tojson(version) + " : 1\n", "recent mongos version"); + + var output = grabStatusOutput(configCopy, true); + assertPresentInOutput(output, "most recently active mongoses:", "section header"); + assertPresentInOutput(output, '"_id" : ' + tojson(s1Host), "recent mongos hostname"); + assertNotPresentInOutput(output, '"_id" : ' + tojson(s2Host), "old mongos hostname"); + + // Older mongoses + configCopy.mongos.remove({_id: s1Host}); + + var output = grabStatusOutput(configCopy, false); + assertPresentInOutput(output, "most recently active mongoses:", "section header"); + assertPresentInOutput(output, tojson(version) + " : 1\n", "recent mongos version"); + + var output = grabStatusOutput(configCopy, true); + assertPresentInOutput(output, "most recently active mongoses:", "section header"); + assertNotPresentInOutput(output, '"_id" : ' + tojson(s1Host), "removed mongos hostname"); + assertPresentInOutput(output, '"_id" : ' + tojson(s2Host), "recent mongos hostname"); + + // No mongoses at all + configCopy.mongos.remove({}); + + var output = grabStatusOutput(configCopy, false); + assertPresentInOutput(output, "most recently active mongoses:\n\tnone", "no mongoses"); + + var output = grabStatusOutput(configCopy, true); + assertPresentInOutput( + output, "most recently active mongoses:\n\tnone", "no mongoses (verbose)"); + + assert(mongos.getDB(dbName).dropDatabase()); + + //////////////////////// + // Extended tests + //////////////////////// + + var testCollDetailsNum = 0; + function testCollDetails(args) { + if (args === undefined || typeof(args) != "object") { + args = {}; + } + + var getCollName = function(x) { + return "test.test" + x.zeroPad(4); + }; + var collName = getCollName(testCollDetailsNum); + + var cmdObj = { + shardCollection: collName, + key: {_id: 1} + }; + if (args.unique) { + cmdObj.unique = true; + } + assert.commandWorked(admin.runCommand(cmdObj)); + + if (args.hasOwnProperty("unique")) { + assert.writeOK(mongos.getDB("config").collections.update( + {_id: collName}, {$set: {"unique": args.unique}})); + } + if (args.hasOwnProperty("noBalance")) { + assert.writeOK(mongos.getDB("config").collections.update( + {_id: collName}, {$set: {"noBalance": args.noBalance}})); + } + + var output = grabStatusOutput(st.config); + + assertPresentInOutput(output, collName, "collection"); + // If any of the previous collection names are present, then their optional indicators + // might also be present. This might taint the results when we go searching through + // the output. + // This also means that earlier collNames can't be a prefix of later collNames. + for (var i = 0; i < testCollDetailsNum; i++) { + assertNotPresentInOutput(output, getCollName(i), "previous collection"); + } + + assertPresentInOutput(output, "unique: " + (!!args.unique), "unique shard key indicator"); + if (args.hasOwnProperty("unique") && typeof(args.unique) != "boolean") { + // non-bool: actual value must be shown + assertPresentInOutput( + output, tojson(args.unique), "unique shard key indicator (non bool)"); + } + + assertPresentInOutput(output, + "balancing: " + (!args.noBalance), + "balancing indicator (inverse of noBalance)"); + if (args.hasOwnProperty("noBalance") && typeof(args.noBalance) != "boolean") { + // non-bool: actual value must be shown + assertPresentInOutput(output, tojson(args.noBalance), "noBalance indicator (non bool)"); + } + + assert(mongos.getCollection(collName).drop()); + + testCollDetailsNum++; + } -// Expected values -testCollDetails({ unique: false, noBalance: false }); -testCollDetails({ unique: true, noBalance: true }); + assert.commandWorked(admin.runCommand({enableSharding: "test"})); -// Unexpected truthy values -testCollDetails({ unique: "truthy unique value 1", noBalance: "truthy noBalance value 1" }); -testCollDetails({ unique: 1, noBalance: 1 }); -testCollDetails({ unique: -1, noBalance: -1 }); -testCollDetails({ unique: {}, noBalance: {} }); + // Defaults + testCollDetails({}); -// Unexpected falsy values -testCollDetails({ unique: "", noBalance: "" }); -testCollDetails({ unique: 0, noBalance: 0 }); + // Expected values + testCollDetails({unique: false, noBalance: false}); + testCollDetails({unique: true, noBalance: true}); -assert( mongos.getDB("test").dropDatabase() ); + // Unexpected truthy values + testCollDetails({unique: "truthy unique value 1", noBalance: "truthy noBalance value 1"}); + testCollDetails({unique: 1, noBalance: 1}); + testCollDetails({unique: -1, noBalance: -1}); + testCollDetails({unique: {}, noBalance: {}}); + // Unexpected falsy values + testCollDetails({unique: "", noBalance: ""}); + testCollDetails({unique: 0, noBalance: 0}); + assert(mongos.getDB("test").dropDatabase()); -st.stop(); + st.stop(); })(); |