ShardChunkManagerPtr ShardingState::getShardChunkManager( const string& ns ){ scoped_lock lk( _mutex ); ChunkManagersMap::const_iterator it = _chunks.find( ns ); if ( it == _chunks.end() ) { return ShardChunkManagerPtr(); } else { return it->second; } }
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; }
DocumentSourceCursor::CursorWithContext::CursorWithContext( const string& ns ) : _readContext( ns ) // Take a read lock. , _chunkMgr(shardingState.needShardChunkManager( ns ) ? shardingState.getShardChunkManager( ns ) : ShardChunkManagerPtr()) {}
ShardChunkManagerPtr QueryResponseBuilder::newChunkManager() const { if ( !shardingState.needShardChunkManager( _parsedQuery.ns() ) ) { return ShardChunkManagerPtr(); } return shardingState.getShardChunkManager( _parsedQuery.ns() ); }