summaryrefslogtreecommitdiff
path: root/s
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-03-30 10:50:10 -0400
committerEliot Horowitz <eliot@10gen.com>2009-03-30 10:50:10 -0400
commit22cd9cc2e537487899c467117f10039b8a25604e (patch)
treed8f3c6889e78710ac1e9934a3708f092859de742 /s
parent1914c3933d7935ee8ae00faa66b430664349f7fd (diff)
downloadmongo-22cd9cc2e537487899c467117f10039b8a25604e.tar.gz
better checkShardVersion
Diffstat (limited to 's')
-rw-r--r--s/shard.cpp7
-rw-r--r--s/shard.h14
-rw-r--r--s/strategy.cpp12
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;
}