const ConfigVersion ShardingState::getVersion( const string& ns ) const { scoped_lock lk(_mutex); ChunkManagersMap::const_iterator it = _chunks.find( ns ); if ( it != _chunks.end() ) { ShardChunkManagerPtr p = it->second; return p->getVersion(); } else { return 0; } }
bool ShardingState::hasVersion( const string& ns , ConfigVersion& version ) { scoped_lock lk(_mutex); ChunkManagersMap::const_iterator it = _chunks.find(ns); if ( it == _chunks.end() ) return false; ShardChunkManagerPtr p = it->second; version = p->getVersion(); return true; }
void ShardingState::appendInfo( BSONObjBuilder& b ) { b.appendBool( "enabled" , _enabled ); if ( ! _enabled ) return; b.append( "configServer" , _configServer ); b.append( "shardName" , _shardName ); b.append( "shardHost" , _shardHost ); { BSONObjBuilder bb( b.subobjStart( "versions" ) ); scoped_lock lk(_mutex); for ( ChunkManagersMap::iterator it = _chunks.begin(); it != _chunks.end(); ++it ) { ShardChunkManagerPtr p = it->second; bb.appendTimestamp( it->first , p->getVersion() ); } bb.done(); } }
ShardChunkManagerPtr ShardingState::getShardChunkManager( const string& ns ){ ConfigVersion version; { // check cache scoped_lock lk( _mutex ); NSVersionMap::const_iterator it = _versions.find( ns ); if ( it == _versions.end() ) { return ShardChunkManagerPtr(); } version = it->second; // TODO SERVER-1849 pending drop work // the manager should use the cached version only if the versions match exactly ShardChunkManagerPtr p = _chunks[ns]; if ( p && p->getVersion() >= version ){ // our cached version is good, so just return return p; } } // load the chunk information for this shard from the config database // a reminder: ShardChunkManager may throw on construction const string c = (_configServer == _shardHost) ? "" /* local */ : _configServer; ShardChunkManagerPtr p( new ShardChunkManager( c , ns , _shardName ) ); // TODO SERVER-1849 verify that the manager's version is exactly the one requested // If not, do update _chunks, but fail the request. { scoped_lock lk( _mutex ); _chunks[ns] = p; } return p; }