summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2011-12-08 11:13:57 -0500
committerGreg Studer <greg@10gen.com>2011-12-08 11:13:57 -0500
commita8deef409a7319faafa4d746881bcaac31ee061c (patch)
tree8822f634ebe82be964c4b757d63170474406e2c5
parent0524f59fcf33abb7ac10bbe03657a1b5348f2443 (diff)
downloadmongo-a8deef409a7319faafa4d746881bcaac31ee061c.tar.gz
SERVER-4171 check in wbl for newly sharded state, reload
-rw-r--r--s/config.cpp10
-rw-r--r--s/config.h1
-rw-r--r--s/writeback_listener.cpp17
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 );