summaryrefslogtreecommitdiff
path: root/s
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2010-07-21 12:17:38 -0400
committerEliot Horowitz <eliot@10gen.com>2010-07-21 12:17:38 -0400
commit03b70c6883fda48f79f6c9754496a0c18b3a9634 (patch)
tree994b7efbaf0d6333e68105d321b8da1b504154f2 /s
parent1f8a29ada3d54e0e46e62f0189c992fe21be55d9 (diff)
downloadmongo-03b70c6883fda48f79f6c9754496a0c18b3a9634.tar.gz
not using Model for DBConfig - first step in SERVER-1427
Diffstat (limited to 's')
-rw-r--r--s/commands_admin.cpp6
-rw-r--r--s/config.cpp79
-rw-r--r--s/config.h36
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