SERVER-8117: listDatabases - config/admin db should come from config servers

This commit is contained in:
Scott Hernandez 2013-01-22 13:53:52 -05:00 committed by Dan Pasette
parent 5c2f3da947
commit ededb03f21
2 changed files with 73 additions and 1 deletions

View File

@ -0,0 +1,46 @@
// tests that listDatabases doesn't show config db on a shard, even if it is there
var test = new ShardingTest({shards: 1, mongos: 1, config: 1, other: {chunksize:1, separateConfig:true}})
var mongos = test.s0
var mongod = test.shard0;
//grab the config db instance by name
var getDBSection = function (dbsArray, dbToFind) {
for(var pos in dbsArray) {
if (dbsArray[pos].name && dbsArray[pos].name === dbToFind)
return dbsArray[pos];
}
return null;
}
mongos.getDB("blah").foo.insert({_id:1})
mongos.getDB("foo").foo.insert({_id:1})
mongos.getDB("raw").foo.insert({_id:1})
//wait for writes to finish
mongos.getDB("raw").getLastError()
//verify that the config db is not on a shard
var res = mongos.adminCommand("listDatabases");
var dbArray = res.databases;
assert(getDBSection(dbArray, "config"), "config db not found! 1")
assert(!getDBSection(dbArray, "config").shards, "config db is on a shard! 1")
//add doc in config/admin db on the shard
mongod.getDB("config").foo.insert({_id:1})
mongod.getDB("admin").foo.insert({_id:1})
//add doc in admin db (via mongos)
mongos.getDB("admin").foo.insert({_id:1})
//verify that the config db is not on a shard
var res = mongos.adminCommand("listDatabases");
var dbArray = res.databases;
//check config db
assert(getDBSection(dbArray, "config"), "config db not found! 2")
assert(!getDBSection(dbArray, "config").shards, "config db is on a shard! 2")
//check admin db
assert(getDBSection(dbArray, "admin"), "admin db not found! 2")
assert(!getDBSection(dbArray, "admin").shards, "admin db is on a shard! 2")
test.stop()

View File

@ -1283,6 +1283,11 @@ namespace mongo {
continue;
}
if ( name == "config" || name == "admin" ) {
//always get this from the config servers
continue;
}
long long size = i->second;
totalSize += size;
@ -1295,7 +1300,7 @@ namespace mongo {
bb.append( temp.obj() );
}
if ( sizes.find( "config" ) == sizes.end() ){
{ // get config db from the config servers (first one)
scoped_ptr<ScopedDbConnection> conn(
ScopedDbConnection::getInternalScopedDbConnection( configServer.getPrimary()
.getConnString() ) );
@ -1316,6 +1321,27 @@ namespace mongo {
conn->done();
}
{ // get admin db from the config servers (first one)
scoped_ptr<ScopedDbConnection> conn(
ScopedDbConnection::getInternalScopedDbConnection(
configServer.getPrimary().getConnString(), 30));
BSONObj x;
if ( conn->get()->simpleCommand( "admin" , &x , "dbstats" ) ){
BSONObjBuilder b;
b.append( "name" , "admin" );
b.appendBool( "empty" , false );
if ( x["fileSize"].type() )
b.appendAs( x["fileSize"] , "sizeOnDisk" );
else
b.append( "sizeOnDisk" , 1 );
bb.append( b.obj() );
}
else {
bb.append( BSON( "name" << "admin" ) );
}
conn->done();
}
bb.done();
result.appendNumber( "totalSize" , totalSize );