// 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 .
*/
/* 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
*/
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( (string)"no primary shard configured for db: " + _name );
return _primary;
}
void setPrimary( string s ){
_primary = s;
}
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);
bool loadByName(const char *nm);
protected:
string _name; // e.g. "alleyinsider"
string _primary; // e.g. localhost , mongo.foo.com:9999
bool _shardingEnabled;
map _sharded; // { "alleyinsider.blog.posts" : { ts : 1 } , ... ] - all ns that are sharded
map _shards; // this will only have entries for things that have been looked at
friend class Grid;
};
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);
string pickShardForNewDB();
bool knowAboutShard( string name ) const;
unsigned long long getNextOpTime() const;
private:
map _databases;
};
class ConfigServer : public DBConfig {
public:
enum { Port = 27016 }; /* standard port # for a grid db */
ConfigServer();
~ConfigServer();
bool ok(){
// TODO: check can connect
return _primary.size() > 0;
}
virtual string modelServer(){
uassert( "ConfigServer not setup" , _primary.size() );
return _primary;
}
/**
call at startup, this will initiate connection to the grid db
*/
bool init( vector configHosts , bool infer );
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