diff options
author | Eliot Horowitz <eliot@10gen.com> | 2010-07-21 12:17:38 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2010-07-21 12:17:38 -0400 |
commit | 03b70c6883fda48f79f6c9754496a0c18b3a9634 (patch) | |
tree | 994b7efbaf0d6333e68105d321b8da1b504154f2 /s | |
parent | 1f8a29ada3d54e0e46e62f0189c992fe21be55d9 (diff) | |
download | mongo-03b70c6883fda48f79f6c9754496a0c18b3a9634.tar.gz |
not using Model for DBConfig - first step in SERVER-1427
Diffstat (limited to 's')
-rw-r--r-- | s/commands_admin.cpp | 6 | ||||
-rw-r--r-- | s/config.cpp | 79 | ||||
-rw-r--r-- | s/config.h | 36 |
3 files changed, 84 insertions, 37 deletions
diff --git a/s/commands_admin.cpp b/s/commands_admin.cpp index eb73a837409..2adddf0d55b 100644 --- a/s/commands_admin.cpp +++ b/s/commands_admin.cpp @@ -251,7 +251,7 @@ namespace mongo { ScopedDbConnection fromconn( config->getPrimary() ); config->setPrimary( s.getConnString() ); - config->save( true ); + config->save(); log() << "movePrimary: dropping " << dbname << " from old" << endl; @@ -289,7 +289,7 @@ namespace mongo { log() << "enabling sharding on: " << dbname << endl; config->enableSharding(); - config->save( true ); + config->save(); return true; } @@ -405,7 +405,7 @@ namespace mongo { tlog() << "CMD: shardcollection: " << cmdObj << endl; config->shardCollection( ns , key , cmdObj["unique"].trueValue() ); - config->save( true ); + config->save(); result << "collectionsharded" << ns; return true; diff --git a/s/config.cpp b/s/config.cpp index 84653085f6d..30d4ba03a4c 100644 --- a/s/config.cpp +++ b/s/config.cpp @@ -48,10 +48,6 @@ namespace mongo { /* --- DBConfig --- */ - string DBConfig::modelServer() { - return configServer.modelServer(); - } - bool DBConfig::isSharded( const string& ns ){ if ( ! _shardingEnabled ) return false; @@ -130,13 +126,13 @@ namespace mongo { return m; if ( shouldReload && ! _isSharded( ns ) ) - reload(); + _reload(); massert( 10181 , (string)"not sharded:" + ns , _isSharded( ns ) ); if ( m && shouldReload ){ log() << "reloading shard info for: " << ns << endl; - reload(); + _reload(); } // this means it was sharded and now isn't.... @@ -168,9 +164,9 @@ namespace mongo { } void DBConfig::unserialize(const BSONObj& from){ - _name = from.getStringField("_id"); log(1) << "DBConfig unserialize: " << _name << " " << from << endl; - + assert( _name == from["_id"].String() ); + _shardingEnabled = from.getBoolField("partitioned"); _primary.reset( from.getStringField("primary") ); @@ -188,19 +184,57 @@ namespace mongo { } } } + + bool DBConfig::load(){ + scoped_lock lk( _lock ); + return _load(); + } + + bool DBConfig::_load(){ + ScopedDbConnection conn( configServer.modelServer() ); + + BSONObj o = conn->findOne( ShardNS::database , BSON( "_id" << _name ) ); + conn.done(); + + if ( o.isEmpty() ) + return false; + unserialize( o ); + return true; + } - bool DBConfig::reload(){ - // TODO: i don't think is 100% correct - return doload(); + void DBConfig::save(){ + scoped_lock lk( _lock ); + _save(); } - bool DBConfig::doload(){ - BSONObjBuilder b; - b.append("_id", _name.c_str()); - BSONObj q = b.done(); - return load(q); + void DBConfig::_save(){ + ScopedDbConnection conn( configServer.modelServer() ); + + BSONObj n; + { + BSONObjBuilder b; + serialize(b); + n = b.obj(); + } + + conn->update( ShardNS::database , BSON( "_id" << _name ) , n , true ); + string err = conn->getLastError(); + conn.done(); + + uassert( 13396 , (string)"DBConfig save failed: " + err , err.size() == 0 ); } + + bool DBConfig::reload(){ + scoped_lock lk( _lock ); + return _reload(); + } + + bool DBConfig::_reload(){ + // TODO: i don't think is 100% correct + return _load(); + } + bool DBConfig::dropDatabase( string& errmsg ){ /** * 1) make sure everything is up @@ -221,7 +255,12 @@ namespace mongo { // 2 grid.removeDB( _name ); - remove( true ); + { + ScopedDbConnection conn( configServer.modelServer() ); + conn->remove( ShardNS::database , BSON( "_id" << _name ) ); + conn.done(); + } + if ( ! configServer.allUp( errmsg ) ){ log() << "error removing from config server even after checking!" << endl; return 0; @@ -320,7 +359,7 @@ namespace mongo { DBConfigPtr& cc = _databases[database]; if ( !cc ){ cc.reset(new DBConfig( database )); - if ( ! cc->doload() ){ + if ( ! cc->load() ){ if ( create ){ // note here that cc->primary == 0. log() << "couldn't find database [" << database << "] in config db" << endl; @@ -576,7 +615,7 @@ namespace mongo { b.appendBool( "partitioned" , true ); b << "primary" << "myserver"; - DBConfig c; + DBConfig c( "abc" ); testInOut( c , b.obj() ); } @@ -592,7 +631,7 @@ namespace mongo { b.append( "sharded" , a.obj() ); - DBConfig c; + DBConfig c("abc"); testInOut( c , b.obj() ); assert( c.isSharded( "abc.foo" ) ); assert( ! c.isSharded( "abc.food" ) ); diff --git a/s/config.h b/s/config.h index 1b2f64475da..bad081bf44f 100644 --- a/s/config.h +++ b/s/config.h @@ -71,14 +71,19 @@ namespace mongo { }; /** - * top level grid configuration for an entire database - * TODO: use shared_ptr for ChunkManager + * top level configuration for a database */ - class DBConfig : public Model { + class DBConfig { public: - DBConfig( string name = "" ) : _name( name ) , _primary("config","") , - _shardingEnabled(false), _lock("DBConfig") { } + DBConfig( string name ) + : _name( name ) , + _primary("config","") , + _shardingEnabled(false), + _lock("DBConfig") { + assert( name.size() ); + } + virtual ~DBConfig(){} string getName(){ return _name; }; @@ -114,18 +119,18 @@ namespace mongo { _primary.reset( s ); } + bool load(); bool reload(); - + void save(); // TODO make private + bool dropDatabase( string& errmsg ); - virtual string modelServer(); - // model stuff - virtual const char * getNS(){ return "config.databases"; } - virtual void serialize(BSONObjBuilder& to); - virtual void unserialize(const BSONObj& from); - + // lockless loading + void serialize(BSONObjBuilder& to); + void unserialize(const BSONObj& from); + protected: /** @@ -134,8 +139,11 @@ namespace mongo { bool _isSharded( const string& ns ); bool _dropShardedCollections( int& num, set<Shard>& allServers , string& errmsg ); - - bool doload(); + + bool _load(); + bool _reload(); + void _save(); // TODO make private + /** @return true if there was sharding info to remove |