diff options
author | Eliot Horowitz <eliot@10gen.com> | 2010-05-26 12:40:46 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2010-05-26 12:40:46 -0400 |
commit | ffd977a64c24ef880e894d3dd31dd824765dec85 (patch) | |
tree | 6806487ff7ca5465467b7e0f1499fc55bfbd03dc | |
parent | 6c101b56c11d235da8ab400f50b83334872d9571 (diff) | |
download | mongo-ffd977a64c24ef880e894d3dd31dd824765dec85.tar.gz |
don't leak ChunkManager use - shared_ptr
-rw-r--r-- | s/balance.cpp | 2 | ||||
-rw-r--r-- | s/chunk.cpp | 2 | ||||
-rw-r--r-- | s/chunk.h | 8 | ||||
-rw-r--r-- | s/commands_admin.cpp | 12 | ||||
-rw-r--r-- | s/commands_public.cpp | 16 | ||||
-rw-r--r-- | s/config.cpp | 22 | ||||
-rw-r--r-- | s/config.h | 9 | ||||
-rw-r--r-- | s/request.cpp | 2 | ||||
-rw-r--r-- | s/request.h | 4 | ||||
-rw-r--r-- | s/strategy.cpp | 4 | ||||
-rw-r--r-- | s/strategy_shard.cpp | 10 | ||||
-rw-r--r-- | s/strategy_single.cpp | 2 |
12 files changed, 49 insertions, 44 deletions
diff --git a/s/balance.cpp b/s/balance.cpp index 6a3955be4df..9e80970fe83 100644 --- a/s/balance.cpp +++ b/s/balance.cpp @@ -172,7 +172,7 @@ namespace mongo { DBConfig * cfg = grid.getDBConfig( ns ); assert( cfg ); - ChunkManager * cm = cfg->getChunkManager( ns ); + ChunkManagerPtr cm = cfg->getChunkManager( ns ); assert( cm ); ChunkPtr c = cm->findChunk( chunkToMove["min"].Obj() ); diff --git a/s/chunk.cpp b/s/chunk.cpp index 503c046834b..70bae695a14 100644 --- a/s/chunk.cpp +++ b/s/chunk.cpp @@ -770,7 +770,7 @@ namespace mongo { } } - void ChunkManager::drop(){ + void ChunkManager::drop( ChunkManagerPtr me ){ rwlock lk( _lock , true ); uassert( 10174 , "config servers not all up" , configServer.allUp() ); diff --git a/s/chunk.h b/s/chunk.h index 48039703100..3129cab328a 100644 --- a/s/chunk.h +++ b/s/chunk.h @@ -29,6 +29,7 @@ #include "../bson/util/atomic_int.h" #include "shardkey.h" #include "shard.h" +#include "config.h" namespace mongo { @@ -300,8 +301,11 @@ namespace mongo { unsigned long long getSequenceNumber(){ return _sequenceNumber; } - - void drop(); + + /** + * @param me - so i don't get deleted before i'm done + */ + void drop( ChunkManagerPtr me ); private: diff --git a/s/commands_admin.cpp b/s/commands_admin.cpp index 0569ee2d57c..c5cff2a274e 100644 --- a/s/commands_admin.cpp +++ b/s/commands_admin.cpp @@ -401,7 +401,7 @@ namespace mongo { return false; } - ChunkManager * cm = config->getChunkManager( ns ); + ChunkManagerPtr cm = config->getChunkManager( ns ); if ( ! cm ){ errmsg = "no chunk manager?"; return false; @@ -424,7 +424,7 @@ namespace mongo { ; } - virtual bool _split( BSONObjBuilder& result , string&errmsg , const string& ns , ChunkManager * manager , ChunkPtr old , BSONObj middle ) = 0; + virtual bool _split( BSONObjBuilder& result , string&errmsg , const string& ns , ChunkManagerPtr manager , ChunkPtr old , BSONObj middle ) = 0; bool run(const string& , BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool){ ShardConnection::sync(); @@ -451,7 +451,7 @@ namespace mongo { } } - ChunkManager * info = config->getChunkManager( ns ); + ChunkManagerPtr info = config->getChunkManager( ns ); ChunkPtr old = info->findChunk( find ); return _split( result , errmsg , ns , info , old , cmdObj.getObjectField( "middle" ) ); @@ -464,7 +464,7 @@ namespace mongo { class SplitValueCommand : public SplitCollectionHelper { public: SplitValueCommand() : SplitCollectionHelper( "splitvalue" ){} - virtual bool _split( BSONObjBuilder& result , string& errmsg , const string& ns , ChunkManager * manager , ChunkPtr old , BSONObj middle ){ + virtual bool _split( BSONObjBuilder& result , string& errmsg , const string& ns , ChunkManagerPtr manager , ChunkPtr old , BSONObj middle ){ result << "shardinfo" << old->toString(); @@ -484,7 +484,7 @@ namespace mongo { class SplitCollection : public SplitCollectionHelper { public: SplitCollection() : SplitCollectionHelper( "split" ){} - virtual bool _split( BSONObjBuilder& result , string& errmsg , const string& ns , ChunkManager * manager , ChunkPtr old , BSONObj middle ){ + virtual bool _split( BSONObjBuilder& result , string& errmsg , const string& ns , ChunkManagerPtr manager , ChunkPtr old , BSONObj middle ){ assert( old.get() ); log() << "splitting: " << ns << " shard: " << old << endl; @@ -537,7 +537,7 @@ namespace mongo { tlog() << "CMD: movechunk: " << cmdObj << endl; - ChunkManager * info = config->getChunkManager( ns ); + ChunkManagerPtr info = config->getChunkManager( ns ); ChunkPtr c = info->findChunk( find ); const Shard& from = c->getShard(); diff --git a/s/commands_public.cpp b/s/commands_public.cpp index 18b8fa60014..34250412ab6 100644 --- a/s/commands_public.cpp +++ b/s/commands_public.cpp @@ -101,10 +101,10 @@ namespace mongo { return passthrough( conf , cmdObj , result ); } - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 10418 , "how could chunk manager be null!" , cm ); - cm->drop(); + cm->drop( cm ); return 1; } @@ -184,7 +184,7 @@ namespace mongo { return true; } - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 10419 , "how could chunk manager be null!" , cm ); vector<shared_ptr<ChunkRange> > chunks; @@ -216,7 +216,7 @@ namespace mongo { } result.appendBool("sharded", true); - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 12594 , "how could chunk manager be null!" , cm ); set<Shard> servers; @@ -276,7 +276,7 @@ namespace mongo { return passthrough( conf , cmdObj , result); } - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 13002 , "how could chunk manager be null!" , cm ); vector<shared_ptr<ChunkRange> > chunks; @@ -390,7 +390,7 @@ namespace mongo { return passthrough( conf , cmdObj , result ); } - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 10420 , "how could chunk manager be null!" , cm ); vector<shared_ptr<ChunkRange> > chunks; @@ -456,7 +456,7 @@ namespace mongo { return passthrough( conf , cmdObj , result ); } - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); massert( 13091 , "how could chunk manager be null!" , cm ); uassert( 13092 , "GridFS chunks collection can only be sharded on files_id", cm->getShardKey().key() == BSON("files_id" << 1)); @@ -524,7 +524,7 @@ namespace mongo { BSONObjBuilder timingBuilder; - ChunkManager * cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManager( fullns ); BSONObj q; if ( cmdObj["query"].type() == Object ){ diff --git a/s/config.cpp b/s/config.cpp index d68007a7bbe..866ae5f8e7e 100644 --- a/s/config.cpp +++ b/s/config.cpp @@ -71,13 +71,13 @@ namespace mongo { _shardingEnabled = true; } - ChunkManager* DBConfig::shardCollection( const string& ns , ShardKeyPattern fieldsAndOrder , bool unique ){ + 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 ); - ChunkManager * info = _shards[ns]; + ChunkManagerPtr info = _shards[ns]; if ( info ) return info; @@ -87,7 +87,7 @@ namespace mongo { log() << "enable sharding on: " << ns << " with shard key: " << fieldsAndOrder << endl; _sharded[ns] = CollectionInfo( fieldsAndOrder , unique ); - info = new ChunkManager( this , ns , fieldsAndOrder , unique ); + info.reset( new ChunkManager( this , ns , fieldsAndOrder , unique ) ); _shards[ns] = info; return info; @@ -100,7 +100,7 @@ namespace mongo { scoped_lock lk( _lock ); - ChunkManager * info = _shards[ns]; + ChunkManagerPtr info = _shards[ns]; map<string,CollectionInfo>::iterator i = _sharded.find( ns ); if ( info == 0 && i == _sharded.end() ){ @@ -110,21 +110,21 @@ namespace mongo { uassert( 10180 , "info but no sharded" , i != _sharded.end() ); _sharded.erase( i ); - _shards.erase( ns ); // TODO: clean this up, maybe switch to shared_ptr + _shards.erase( ns ); return true; } - ChunkManager* DBConfig::getChunkManager( const string& ns , bool reload ){ + ChunkManagerPtr DBConfig::getChunkManager( const string& ns , bool reload ){ scoped_lock lk( _lock ); - ChunkManager* m = _shards[ns]; + 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 = new ChunkManager( this , ns , _sharded[ ns ].key , _sharded[ns].unique ); + m.reset( new ChunkManager( this , ns , _sharded[ ns ].key , _sharded[ns].unique ) ); _shards[ns] = m; return m; } @@ -176,7 +176,7 @@ namespace mongo { Model::save( check ); scoped_lock lk( _lock ); - for ( map<string,ChunkManager*>::iterator i=_shards.begin(); i != _shards.end(); i++) + for ( map<string,ChunkManagerPtr>::iterator i=_shards.begin(); i != _shards.end(); i++) i->second->save(); } @@ -261,7 +261,7 @@ namespace mongo { num = 0; set<string> seen; while ( true ){ - map<string,ChunkManager*>::iterator i = _shards.begin(); + map<string,ChunkManagerPtr>::iterator i = _shards.begin(); if ( i == _shards.end() ) break; @@ -275,7 +275,7 @@ namespace mongo { log(1) << "\t dropping sharded collection: " << i->first << endl; i->second->getAllShards( allServers ); - i->second->drop(); + i->second->drop( i->second ); num++; uassert( 10184 , "_dropShardedCollections too many collections - bailing" , num < 100000 ); diff --git a/s/config.h b/s/config.h index 6c3ae6ad5ae..4a7c6a171dd 100644 --- a/s/config.h +++ b/s/config.h @@ -47,7 +47,8 @@ namespace mongo { extern Grid grid; class ChunkManager; - + typedef shared_ptr<ChunkManager> ChunkManagerPtr; + class CollectionInfo { public: CollectionInfo( ShardKeyPattern _key = BSONObj() , bool _unique = false ) : @@ -76,14 +77,14 @@ namespace mongo { } void enableSharding(); - ChunkManager* shardCollection( const string& ns , ShardKeyPattern fieldsAndOrder , bool unique ); + ChunkManagerPtr 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 ); + ChunkManagerPtr getChunkManager( const string& ns , bool reload = false ); /** * @return the correct for shard for the ns @@ -135,7 +136,7 @@ namespace mongo { bool _shardingEnabled; map<string,CollectionInfo> _sharded; // { "alleyinsider.blog.posts" : { ts : 1 } , ... ] - all ns that are sharded - map<string,ChunkManager*> _shards; // this will only have entries for things that have been looked at + map<string,ChunkManagerPtr> _shards; // this will only have entries for things that have been looked at mongo::mutex _lock; // TODO: change to r/w lock ?? diff --git a/s/request.cpp b/s/request.cpp index 96c9c461cca..b048b743a2c 100644 --- a/s/request.cpp +++ b/s/request.cpp @@ -58,7 +58,7 @@ namespace mongo { uassert( 10193 , (string)"no shard info for: " + getns() , _chunkManager ); } else { - _chunkManager = 0; + _chunkManager.reset(); } _m.header()->id = _id; diff --git a/s/request.h b/s/request.h index 5a5bf638854..a1c7e9e2646 100644 --- a/s/request.h +++ b/s/request.h @@ -59,7 +59,7 @@ namespace mongo { return _config->isShardingEnabled(); } - ChunkManager * getChunkManager() const { + ChunkManagerPtr getChunkManager() const { return _chunkManager; } @@ -99,7 +99,7 @@ namespace mongo { MSGID _id; DBConfig * _config; - ChunkManager * _chunkManager; + ChunkManagerPtr _chunkManager; int _clientId; ClientInfo * _clientInfo; diff --git a/s/strategy.cpp b/s/strategy.cpp index 8c2e4896b27..b1d7351de08 100644 --- a/s/strategy.cpp +++ b/s/strategy.cpp @@ -170,7 +170,7 @@ namespace mongo { ShardChunkVersion version = 0; unsigned long long officialSequenceNumber = 0; - ChunkManager * manager = 0; + ChunkManagerPtr manager; if ( conf->isSharded( ns ) ){ manager = conf->getChunkManager( ns , authoritative ); officialSequenceNumber = manager->getSequenceNumber(); @@ -183,7 +183,7 @@ namespace mongo { log(2) << " have to set shard version for conn: " << &conn << " ns:" << ns << " my last seq: " << sequenceNumber << " current: " << officialSequenceNumber - << " version: " << version << " manager: " << manager + << " version: " << version << " manager: " << manager.get() << endl; BSONObj result; diff --git a/s/strategy_shard.cpp b/s/strategy_shard.cpp index 0d2043ca8d0..6dcb3c67c97 100644 --- a/s/strategy_shard.cpp +++ b/s/strategy_shard.cpp @@ -39,7 +39,7 @@ namespace mongo { if ( q.ntoreturn == 1 && strstr(q.ns, ".$cmd") ) throw UserException( 8010 , "something is wrong, shouldn't see a command here" ); - ChunkManager * info = r.getChunkManager(); + ChunkManagerPtr info = r.getChunkManager(); assert( info ); Query query( q.query ); @@ -125,7 +125,7 @@ namespace mongo { cursorCache.remove( id ); } - void _insert( Request& r , DbMessage& d, ChunkManager* manager ){ + void _insert( Request& r , DbMessage& d, ChunkManagerPtr manager ){ while ( d.moreJSObjs() ){ BSONObj o = d.nextJsObj(); @@ -158,7 +158,7 @@ namespace mongo { } } - void _update( Request& r , DbMessage& d, ChunkManager* manager ){ + void _update( Request& r , DbMessage& d, ChunkManagerPtr manager ){ int flags = d.pullInt(); BSONObj query = d.nextJsObj(); @@ -233,7 +233,7 @@ namespace mongo { } - void _delete( Request& r , DbMessage& d, ChunkManager* manager ){ + void _delete( Request& r , DbMessage& d, ChunkManagerPtr manager ){ int flags = d.pullInt(); bool justOne = flags & 1; @@ -267,7 +267,7 @@ namespace mongo { log(3) << "write: " << ns << endl; DbMessage& d = r.d(); - ChunkManager * info = r.getChunkManager(); + ChunkManagerPtr info = r.getChunkManager(); assert( info ); if ( op == dbInsert ){ diff --git a/s/strategy_single.cpp b/s/strategy_single.cpp index b5e6d2c5248..49a2243869d 100644 --- a/s/strategy_single.cpp +++ b/s/strategy_single.cpp @@ -110,7 +110,7 @@ namespace mongo { ! o["unique"].trueValue() || r.getConfig()->getChunkManager( ns )->getShardKey().uniqueAllowd( newIndexKey ) ); - ChunkManager * cm = r.getConfig()->getChunkManager( ns ); + ChunkManagerPtr cm = r.getConfig()->getChunkManager( ns ); assert( cm ); for ( int i=0; i<cm->numChunks();i++) doWrite( op , r , cm->getChunk(i)->getShard() ); |