summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgregs <greg@10gen.com>2011-08-08 21:37:33 -0400
committergregs <greg@10gen.com>2011-08-09 02:16:54 -0400
commit4d3fdcfc10de6d4628e7b4cdcde0348f8264c2d7 (patch)
tree42d05c3d980e912578c82bb9b67a5868e0aca3ea
parent1436fe459591edc34478bff2172de33f75e7b5fc (diff)
downloadmongo-4d3fdcfc10de6d4628e7b4cdcde0348f8264c2d7.tar.gz
fix semantics of the getChunkManager() method, add non-erroring version SERVER-3517
-rw-r--r--s/commands_admin.cpp2
-rw-r--r--s/commands_public.cpp9
-rw-r--r--s/config.cpp13
-rw-r--r--s/config.h1
-rw-r--r--s/request.cpp4
-rw-r--r--s/shard_version.cpp2
-rw-r--r--s/strategy_shard.cpp2
-rw-r--r--s/writeback_listener.cpp2
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 );
}