ChunkManagerPtr DBConfig::getChunkManager( const string& ns , bool reload ){ scoped_lock lk( _lock ); ChunkManagerPtr m = _shards[ns]; if ( m && ! reload ) return m; uassert( 10181 , (string)"not sharded:" + ns , _isSharded( ns ) ); if ( m && reload ) log() << "reloading shard info for: " << ns << endl; m.reset( new ChunkManager( this , ns , _sharded[ ns ].key , _sharded[ns].unique ) ); _shards[ns] = m; return m; }
ChunkManagerPtr DBConfig::shardCollection( const string& ns , ShardKeyPattern fieldsAndOrder , bool unique ){ if ( ! _shardingEnabled ) throw UserException( 8042 , "db doesn't have sharding enabled" ); scoped_lock lk( _lock ); ChunkManagerPtr info = _shards[ns]; if ( info ) return info; if ( _isSharded( ns ) ) throw UserException( 8043 , "already sharded" ); log() << "enable sharding on: " << ns << " with shard key: " << fieldsAndOrder << endl; _sharded[ns] = CollectionInfo( fieldsAndOrder , unique ); info.reset( new ChunkManager( this , ns , fieldsAndOrder , unique ) ); _shards[ns] = info; return info; }