diff options
author | Greg Studer <greg@10gen.com> | 2011-12-08 11:13:57 -0500 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2011-12-08 11:13:57 -0500 |
commit | a8deef409a7319faafa4d746881bcaac31ee061c (patch) | |
tree | 8822f634ebe82be964c4b757d63170474406e2c5 | |
parent | 0524f59fcf33abb7ac10bbe03657a1b5348f2443 (diff) | |
download | mongo-a8deef409a7319faafa4d746881bcaac31ee061c.tar.gz |
SERVER-4171 check in wbl for newly sharded state, reload
-rw-r--r-- | s/config.cpp | 10 | ||||
-rw-r--r-- | s/config.h | 1 | ||||
-rw-r--r-- | s/writeback_listener.cpp | 17 |
3 files changed, 23 insertions, 5 deletions
diff --git a/s/config.cpp b/s/config.cpp index 07667172167..d7583c9320a 100644 --- a/s/config.cpp +++ b/s/config.cpp @@ -211,6 +211,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 << " :: caused by :: " << e.toString() << endl; + return ChunkManagerPtr(); + } + } + ChunkManagerPtr DBConfig::getChunkManager( const string& ns , bool shouldReload ) { scoped_lock lk( _lock ); diff --git a/s/config.h b/s/config.h index 13afe23d978..a7acb7deaa1 100644 --- a/s/config.h +++ b/s/config.h @@ -132,6 +132,7 @@ namespace mongo { */ bool isSharded( const string& ns ); + ChunkManagerPtr getChunkManagerIfExists( const string& ns , bool reload = false ); ChunkManagerPtr getChunkManager( const string& ns , bool reload = false ); /** diff --git a/s/writeback_listener.cpp b/s/writeback_listener.cpp index df7cc353e83..fcdd37fa0f9 100644 --- a/s/writeback_listener.cpp +++ b/s/writeback_listener.cpp @@ -162,14 +162,16 @@ namespace mongo { DBConfigPtr db = grid.getDBConfig( ns ); ShardChunkVersion needVersion( data["version"] ); + ChunkManagerPtr manager = db->getChunkManagerIfExists( ns ); + LOG(1) << "connectionId: " << cid << " writebackId: " << wid << " needVersion : " << needVersion.toString() - << " mine : " << db->getChunkManager( ns )->getVersion().toString() << endl;// TODO change to log(3) + << " mine : " << ( manager ? manager->getVersion().toString() : "(none)" ) << endl;// TODO change to log(3) if ( logLevel ) log(1) << debugString( m ) << endl; - ShardChunkVersion start = db->getChunkManager( ns )->getVersion(); + ShardChunkVersion start = ( manager ? manager->getVersion() : (ShardChunkVersion)0 ); - if ( needVersion.isSet() && needVersion <= start ) { + if ( manager && needVersion.isSet() && needVersion <= start ) { // this means when the write went originally, the version was old // if we're here, it means we've already updated the config, so don't need to do again //db->getChunkManager( ns , true ); // SERVER-1349 @@ -180,11 +182,16 @@ namespace mongo { // we need to reload the chunk manager and get the new shard versions bool good = false; for ( int i=0; i<100; i++ ) { - if ( db->getChunkManager( ns , true )->getVersion() >= needVersion ) { + manager = db->getChunkManagerIfExists( ns , true ); + if( ! manager && needVersion == 0 ){ + good = true; + break; + } + else if ( manager->getVersion() >= needVersion ) { good = true; break; } - log() << "writeback getChunkManager didn't update?" << endl; + log() << "chunk manager didn't update in writeback listener, wanted version : " << needVersion << ", found : " << ( manager ? manager->getVersion().toString() : "(none)" ) << endl; sleepmillis(10); } assert( good ); |