diff options
Diffstat (limited to 's/config.h')
-rw-r--r-- | s/config.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/s/config.h b/s/config.h new file mode 100644 index 0000000..16aa67a --- /dev/null +++ b/s/config.h @@ -0,0 +1,195 @@ +// config.h + +/** +* Copyright (C) 2008 10gen Inc. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License, version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* This file is things related to the "grid configuration": + - what machines make up the db component of our cloud + - where various ranges of things live +*/ + +#pragma once + +#include "../db/namespace.h" +#include "../client/dbclient.h" +#include "../client/model.h" +#include "shardkey.h" + +namespace mongo { + + class Grid; + class ConfigServer; + + extern ConfigServer configServer; + extern Grid grid; + + class ChunkManager; + + class CollectionInfo { + public: + CollectionInfo( ShardKeyPattern _key = BSONObj() , bool _unique = false ) : + key( _key ) , unique( _unique ){} + + ShardKeyPattern key; + bool unique; + }; + + /** + * top level grid configuration for an entire database + * TODO: use shared_ptr for ChunkManager + */ + class DBConfig : public Model { + public: + DBConfig( string name = "" ) : _name( name ) , _primary("") , _shardingEnabled(false){ } + + string getName(){ return _name; }; + + /** + * @return if anything in this db is partitioned or not + */ + bool isShardingEnabled(){ + return _shardingEnabled; + } + + void enableSharding(); + ChunkManager* shardCollection( const string& ns , ShardKeyPattern fieldsAndOrder , bool unique ); + + /** + * @return whether or not this partition is partitioned + */ + bool isSharded( const string& ns ); + + ChunkManager* getChunkManager( const string& ns , bool reload = false ); + + /** + * @return the correct for shard for the ns + * if the namespace is sharded, will return an empty string + */ + string getShard( const string& ns ); + + string getPrimary(){ + if ( _primary.size() == 0 ) + throw UserException( 8041 , (string)"no primary shard configured for db: " + _name ); + return _primary; + } + + void setPrimary( string s ){ + _primary = s; + } + + bool reload(); + + bool dropDatabase( string& errmsg ); + + virtual void save( bool check=true); + + virtual string modelServer(); + + // model stuff + + virtual const char * getNS(){ return "config.databases"; } + virtual void serialize(BSONObjBuilder& to); + virtual void unserialize(const BSONObj& from); + + protected: + + bool _dropShardedCollections( int& num, set<string>& allServers , string& errmsg ); + + bool doload(); + + /** + @return true if there was sharding info to remove + */ + bool removeSharding( const string& ns ); + + string _name; // e.g. "alleyinsider" + string _primary; // e.g. localhost , mongo.foo.com:9999 + bool _shardingEnabled; + + map<string,CollectionInfo> _sharded; // { "alleyinsider.blog.posts" : { ts : 1 } , ... ] - all ns that are sharded + map<string,ChunkManager*> _shards; // this will only have entries for things that have been looked at + + friend class Grid; + friend class ChunkManager; + }; + + /** + * stores meta-information about the grid + * TODO: used shard_ptr for DBConfig pointers + */ + class Grid { + public: + /** + gets the config the db. + will return an empty DBConfig if not in db already + */ + DBConfig * getDBConfig( string ns , bool create=true); + + /** + * removes db entry. + * on next getDBConfig call will fetch from db + */ + void removeDB( string db ); + + string pickShardForNewDB(); + + bool knowAboutShard( string name ) const; + + unsigned long long getNextOpTime() const; + private: + map<string,DBConfig*> _databases; + boost::mutex _lock; // TODO: change to r/w lock + }; + + class ConfigServer : public DBConfig { + public: + + ConfigServer(); + ~ConfigServer(); + + bool ok(){ + // TODO: check can connect + return _primary.size() > 0; + } + + virtual string modelServer(){ + uassert( 10190 , "ConfigServer not setup" , _primary.size() ); + return _primary; + } + + /** + call at startup, this will initiate connection to the grid db + */ + bool init( vector<string> configHosts ); + + bool allUp(); + bool allUp( string& errmsg ); + + int dbConfigVersion(); + int dbConfigVersion( DBClientBase& conn ); + + /** + * @return 0 = ok, otherwise error # + */ + int checkConfigVersion(); + + static int VERSION; + + private: + string getHost( string name , bool withPort ); + }; + +} // namespace mongo |