00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #pragma once
00020
00021 #include "../pch.h"
00022
00023 #include "../db/jsobj.h"
00024
00025 #include "d_chunk_manager.h"
00026 #include "util.h"
00027
00028 namespace mongo {
00029
00030 class Database;
00031 class DiskLoc;
00032
00033 typedef ShardChunkVersion ConfigVersion;
00034 typedef map<string,ConfigVersion> NSVersionMap;
00035
00036
00037
00038
00039
00040 class ShardingState {
00041 public:
00042 ShardingState();
00043
00044 bool enabled() const { return _enabled; }
00045 const string& getConfigServer() const { return _configServer; }
00046 void enable( const string& server );
00047
00048 void gotShardName( const string& name );
00049 void gotShardHost( string host );
00050
00052 void resetShardingState();
00053
00054
00055
00056 bool hasVersion( const string& ns );
00057 bool hasVersion( const string& ns , ConfigVersion& version );
00058 const ConfigVersion getVersion( const string& ns ) const;
00059
00074 void resetVersion( const string& ns );
00075
00085 bool trySetVersion( const string& ns , ConfigVersion& version );
00086
00087 void appendInfo( BSONObjBuilder& b );
00088
00089
00090
00091 bool needShardChunkManager( const string& ns ) const;
00092 ShardChunkManagerPtr getShardChunkManager( const string& ns );
00093
00094
00095
00107 void donateChunk( const string& ns , const BSONObj& min , const BSONObj& max , ShardChunkVersion version );
00108
00120 void undoDonateChunk( const string& ns , const BSONObj& min , const BSONObj& max , ShardChunkVersion version );
00121
00135 void splitChunk( const string& ns , const BSONObj& min , const BSONObj& max , const vector<BSONObj>& splitKeys ,
00136 ShardChunkVersion version );
00137
00138 bool inCriticalMigrateSection();
00139
00140 private:
00141 bool _enabled;
00142
00143 string _configServer;
00144
00145 string _shardName;
00146 string _shardHost;
00147
00148
00149 mutable mongo::mutex _mutex;
00150
00151
00152
00153 typedef map<string,ShardChunkManagerPtr> ChunkManagersMap;
00154 ChunkManagersMap _chunks;
00155 };
00156
00157 extern ShardingState shardingState;
00158
00163 class ShardedConnectionInfo {
00164 public:
00165 ShardedConnectionInfo();
00166
00167 const OID& getID() const { return _id; }
00168 bool hasID() const { return _id.isSet(); }
00169 void setID( const OID& id );
00170
00171 const ConfigVersion getVersion( const string& ns ) const;
00172 void setVersion( const string& ns , const ConfigVersion& version );
00173
00174 static ShardedConnectionInfo* get( bool create );
00175 static void reset();
00176
00177 bool inForceVersionOkMode() const {
00178 return _forceVersionOk;
00179 }
00180
00181 void enterForceVersionOkMode() { _forceVersionOk = true; }
00182 void leaveForceVersionOkMode() { _forceVersionOk = false; }
00183
00184 private:
00185
00186 OID _id;
00187 NSVersionMap _versions;
00188 bool _forceVersionOk;
00189
00190 static boost::thread_specific_ptr<ShardedConnectionInfo> _tl;
00191 };
00192
00193 struct ShardForceVersionOkModeBlock {
00194 ShardForceVersionOkModeBlock() {
00195 info = ShardedConnectionInfo::get( false );
00196 if ( info )
00197 info->enterForceVersionOkMode();
00198 }
00199 ~ShardForceVersionOkModeBlock() {
00200 if ( info )
00201 info->leaveForceVersionOkMode();
00202 }
00203
00204 ShardedConnectionInfo * info;
00205 };
00206
00207
00208
00209
00210
00211 unsigned long long extractVersion( BSONElement e , string& errmsg );
00212
00213
00217 bool haveLocalShardingInfo( const string& ns );
00218
00222 bool shardVersionOk( const string& ns , bool write , string& errmsg );
00223
00227 struct DbResponse;
00228
00229 bool _handlePossibleShardedMessage( Message &m, DbResponse * dbresponse );
00230
00232 inline bool handlePossibleShardedMessage( Message &m, DbResponse * dbresponse ) {
00233 if( !shardingState.enabled() )
00234 return false;
00235 return _handlePossibleShardedMessage(m, dbresponse);
00236 }
00237
00238 void logOpForSharding( const char * opstr , const char * ns , const BSONObj& obj , BSONObj * patt );
00239 void aboutToDeleteForSharding( const Database* db , const DiskLoc& dl );
00240
00241 }