diff options
author | gregs <greg@10gen.com> | 2011-08-08 21:37:33 -0400 |
---|---|---|
committer | gregs <greg@10gen.com> | 2011-08-09 02:16:54 -0400 |
commit | 4d3fdcfc10de6d4628e7b4cdcde0348f8264c2d7 (patch) | |
tree | 42d05c3d980e912578c82bb9b67a5868e0aca3ea | |
parent | 1436fe459591edc34478bff2172de33f75e7b5fc (diff) | |
download | mongo-4d3fdcfc10de6d4628e7b4cdcde0348f8264c2d7.tar.gz |
fix semantics of the getChunkManager() method, add non-erroring version SERVER-3517
-rw-r--r-- | s/commands_admin.cpp | 2 | ||||
-rw-r--r-- | s/commands_public.cpp | 9 | ||||
-rw-r--r-- | s/config.cpp | 13 | ||||
-rw-r--r-- | s/config.h | 1 | ||||
-rw-r--r-- | s/request.cpp | 4 | ||||
-rw-r--r-- | s/shard_version.cpp | 2 | ||||
-rw-r--r-- | s/strategy_shard.cpp | 2 | ||||
-rw-r--r-- | s/writeback_listener.cpp | 2 |
8 files changed, 24 insertions, 11 deletions
diff --git a/s/commands_admin.cpp b/s/commands_admin.cpp index 6d3e398370c..53a4bee92b7 100644 --- a/s/commands_admin.cpp +++ b/s/commands_admin.cpp @@ -545,7 +545,7 @@ namespace mongo { return false; } - ChunkManagerPtr cm = config->getChunkManager( ns ); + ChunkManagerPtr cm = config->getChunkManagerIfExists( ns ); if ( ! cm ) { errmsg = "no chunk manager?"; return false; diff --git a/s/commands_public.cpp b/s/commands_public.cpp index eb19ef68fc3..cbb7c2374df 100644 --- a/s/commands_public.cpp +++ b/s/commands_public.cpp @@ -393,7 +393,6 @@ namespace mongo { filter = cmdObj["query"].Obj(); DBConfigPtr conf = grid.getDBConfig( dbName , false ); - if ( ! conf || ! conf->isShardingEnabled() || ! conf->isSharded( fullns ) ) { ShardConnection conn( conf->getPrimary() , fullns ); @@ -413,7 +412,7 @@ namespace mongo { } // this collection got sharded - ChunkManagerPtr cm = conf->getChunkManager( fullns , true ); + ChunkManagerPtr cm = conf->getChunkManagerIfExists( fullns , true ); if ( ! cm ) { errmsg = "should be sharded now"; result.append( "root" , temp ); @@ -424,7 +423,7 @@ namespace mongo { long long total = 0; map<string,long long> shardCounts; - ChunkManagerPtr cm = conf->getChunkManager( fullns ); + ChunkManagerPtr cm = conf->getChunkManagerIfExists( fullns ); while ( true ) { if ( ! cm ) { // probably unsharded now @@ -442,7 +441,7 @@ namespace mongo { if ( conn.setVersion() ) { total = 0; shardCounts.clear(); - cm = conf->getChunkManager( fullns ); + cm = conf->getChunkManagerIfExists( fullns ); conn.done(); hadToBreak = true; break; @@ -463,7 +462,7 @@ namespace mongo { // my version is old total = 0; shardCounts.clear(); - cm = conf->getChunkManager( fullns , true ); + cm = conf->getChunkManagerIfExists( fullns , true ); hadToBreak = true; break; } diff --git a/s/config.cpp b/s/config.cpp index 82942eb5320..bc9903fa29c 100644 --- a/s/config.cpp +++ b/s/config.cpp @@ -185,6 +185,16 @@ namespace mongo { return true; } + ChunkManagerPtr DBConfig::getChunkManagerIfExists( const string& ns, bool shouldReload ){ + try{ + return getChunkManager( ns, shouldReload ); + } + catch( AssertionException& e ){ + warning() << "chunk manager not found for " << ns << causedBy( e ) << endl; + return ChunkManagerPtr(); + } + } + ChunkManagerPtr DBConfig::getChunkManager( const string& ns , bool shouldReload ) { BSONObj key; bool unique; @@ -226,6 +236,7 @@ namespace mongo { if ( v == oldVersion ) { scoped_lock lk( _lock ); CollectionInfo& ci = _collections[ns]; + massert( 15882 , str::stream() << "not sharded after reloading from chunks : " << ns , ci.isSharded() ); return ci.getCM(); } } @@ -252,7 +263,7 @@ namespace mongo { ci.resetCM( temp.release() ); } - assert( ci.getCM().get() ); + massert( 15883 , str::stream() << "not sharded after chunk manager reset : " << ns , ci.isSharded() ); return ci.getCM(); } diff --git a/s/config.h b/s/config.h index 6c8f8934aed..90c06cb0223 100644 --- a/s/config.h +++ b/s/config.h @@ -143,6 +143,7 @@ namespace mongo { bool isSharded( const string& ns ); ChunkManagerPtr getChunkManager( const string& ns , bool reload = false ); + ChunkManagerPtr getChunkManagerIfExists( const string& ns , bool reload = false ); /** * @return the correct for shard for the ns diff --git a/s/request.cpp b/s/request.cpp index 2dc0beca4b5..36488cb5617 100644 --- a/s/request.cpp +++ b/s/request.cpp @@ -77,7 +77,9 @@ namespace mongo { if ( _config->isSharded( nsStr ) ) { _chunkManager = _config->getChunkManager( nsStr , reload ); - uassert( 10193 , (string)"no shard info for: " + getns() , _chunkManager ); + // TODO: All of these uasserts are no longer necessary, getChunkManager() throws when + // not returning the right value. + uassert( 10193 , (string)"no shard info for: " + nsStr , _chunkManager ); } else { _chunkManager.reset(); diff --git a/s/shard_version.cpp b/s/shard_version.cpp index da712b8abad..4f84b0ae61e 100644 --- a/s/shard_version.cpp +++ b/s/shard_version.cpp @@ -96,7 +96,7 @@ namespace mongo { ChunkManagerPtr manager; const bool isSharded = conf->isSharded( ns ); if ( isSharded ) { - manager = conf->getChunkManager( ns , authoritative ); + manager = conf->getChunkManagerIfExists( ns , authoritative ); // It's possible the chunk manager was reset since we checked whether sharded was true, // so must check this here. if( manager ) officialSequenceNumber = manager->getSequenceNumber(); diff --git a/s/strategy_shard.cpp b/s/strategy_shard.cpp index db21ec05efb..c6b30e7965f 100644 --- a/s/strategy_shard.cpp +++ b/s/strategy_shard.cpp @@ -233,7 +233,7 @@ namespace mongo { LOG( logLevel ) << "retrying insert because of StaleConfigException: " << e << " object: " << o << endl; unsigned long long old = manager->getSequenceNumber(); - manager = conf->getChunkManager(ns); + manager = conf->getChunkManagerIfExists(ns); LOG( logLevel ) << " sequenece number - old: " << old << " new: " << manager->getSequenceNumber() << endl; diff --git a/s/writeback_listener.cpp b/s/writeback_listener.cpp index bfab237fc84..ba982229bff 100644 --- a/s/writeback_listener.cpp +++ b/s/writeback_listener.cpp @@ -216,7 +216,7 @@ namespace mongo { if ( gle["code"].numberInt() == 9517 ) { log() << "writeback failed because of stale config, retrying attempts: " << attempts << endl; - if( ! db->getChunkManager( ns , true ).get() ){ + if( ! db->getChunkManagerIfExists( ns , true ) ){ uassert( 15881, str::stream() << "Could not reload chunk manager after " << attempts << " attempts.", attempts <= 4 ); sleepsecs( attempts - 1 ); } |