diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-03-30 10:50:10 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-03-30 10:50:10 -0400 |
commit | 22cd9cc2e537487899c467117f10039b8a25604e (patch) | |
tree | d8f3c6889e78710ac1e9934a3708f092859de742 /s | |
parent | 1914c3933d7935ee8ae00faa66b430664349f7fd (diff) | |
download | mongo-22cd9cc2e537487899c467117f10039b8a25604e.tar.gz |
better checkShardVersion
Diffstat (limited to 's')
-rw-r--r-- | s/shard.cpp | 7 | ||||
-rw-r--r-- | s/shard.h | 14 | ||||
-rw-r--r-- | s/strategy.cpp | 12 |
3 files changed, 28 insertions, 5 deletions
diff --git a/s/shard.cpp b/s/shard.cpp index 9e293c360b1..91f6dc544fb 100644 --- a/s/shard.cpp +++ b/s/shard.cpp @@ -150,6 +150,8 @@ namespace mongo { // ------- ShardManager -------- + unsigned long long ShardManager::NextSequenceNumber = 1; + ShardManager::ShardManager( DBConfig * config , string ns , ShardKeyPattern pattern ) : _config( config ) , _ns( ns ) , _key( pattern ){ Shard temp(0); @@ -173,9 +175,11 @@ namespace mongo { s->_markModified(); _shards.push_back( s ); - + log() << "no shards for:" << ns << " so creating first: " << s->toString() << endl; } + + _sequenceNumber = ++NextSequenceNumber; } ShardManager::~ShardManager(){ @@ -231,6 +235,7 @@ namespace mongo { if ( ! s->_modified ) continue; s->save( true ); + _sequenceNumber = ++NextSequenceNumber; } massert( "how did version get smalled" , getVersion() >= a ); diff --git a/s/shard.h b/s/shard.h index 482203188d1..98ca2ee37e8 100644 --- a/s/shard.h +++ b/s/shard.h @@ -138,16 +138,26 @@ namespace mongo { ServerShardVersion getVersion( const string& server ) const; ServerShardVersion getVersion() const; + + /** + * this is just an increasing number of how many shard managers we have so we know if something has been updated + */ + unsigned long long getSequenceNumber(){ + return _sequenceNumber; + } + private: DBConfig * _config; string _ns; ShardKeyPattern _key; vector<Shard*> _shards; - + mutex _lock; - + unsigned long long _sequenceNumber; + friend class Shard; + static unsigned long long NextSequenceNumber; }; } // namespace mongo diff --git a/s/strategy.cpp b/s/strategy.cpp index 68cdf71f8ab..dc644cb86e7 100644 --- a/s/strategy.cpp +++ b/s/strategy.cpp @@ -50,6 +50,8 @@ namespace mongo { dbcon.done(); } + map<DBClientBase*,unsigned long long> checkShardVersionLastSequence; + void checkShardVersion( DBClientBase& conn , const string& ns , bool authoritative ){ // TODO: cache, optimize, etc... @@ -62,11 +64,17 @@ namespace mongo { ShardManager * manager = conf->getShardManager( ns , authoritative ); - - ServerShardVersion version = manager->getVersion( conn.getServerAddress() ); + + unsigned long long & sequenceNumber = checkShardVersionLastSequence[ &conn ]; + if ( manager->getSequenceNumber() == sequenceNumber ) + return; + + ServerShardVersion version = manager->getVersion( conn.getServerAddress() ); BSONObj result; if ( setShardVersion( conn , ns , version , authoritative , result ) ){ + // success! + sequenceNumber = manager->getSequenceNumber(); return; } |