summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2010-05-26 12:40:46 -0400
committerEliot Horowitz <eliot@10gen.com>2010-05-26 12:40:46 -0400
commitffd977a64c24ef880e894d3dd31dd824765dec85 (patch)
tree6806487ff7ca5465467b7e0f1499fc55bfbd03dc
parent6c101b56c11d235da8ab400f50b83334872d9571 (diff)
downloadmongo-ffd977a64c24ef880e894d3dd31dd824765dec85.tar.gz
don't leak ChunkManager use - shared_ptr
-rw-r--r--s/balance.cpp2
-rw-r--r--s/chunk.cpp2
-rw-r--r--s/chunk.h8
-rw-r--r--s/commands_admin.cpp12
-rw-r--r--s/commands_public.cpp16
-rw-r--r--s/config.cpp22
-rw-r--r--s/config.h9
-rw-r--r--s/request.cpp2
-rw-r--r--s/request.h4
-rw-r--r--s/strategy.cpp4
-rw-r--r--s/strategy_shard.cpp10
-rw-r--r--s/strategy_single.cpp2
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() );