summaryrefslogtreecommitdiff
path: root/src/mongo/s/version_manager.cpp
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2014-10-06 17:36:18 -0400
committerRandolph Tan <randolph@10gen.com>2014-10-15 11:03:20 -0400
commit126069374744c62c65fac86a492531d658961f40 (patch)
tree9ea6d5070815c5e1dba6119cee7dcf19b4aaf67c /src/mongo/s/version_manager.cpp
parent8cbf581a2694c496681b8fd12e2cc03747358869 (diff)
downloadmongo-126069374744c62c65fac86a492531d658961f40.tar.gz
SERVER-15402 Improve ShardPtr/ConnectionString management for commands and setVersion
Make Shard almost logically immutable. The only non-const method remaining is reset(), which will eventually be removed.
Diffstat (limited to 'src/mongo/s/version_manager.cpp')
-rw-r--r--src/mongo/s/version_manager.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/src/mongo/s/version_manager.cpp b/src/mongo/s/version_manager.cpp
index e0be9a67c5e..9c94be9da9d 100644
--- a/src/mongo/s/version_manager.cpp
+++ b/src/mongo/s/version_manager.cpp
@@ -224,11 +224,21 @@ namespace mongo {
if( isSharded && manager ){
Shard shard = Shard::make( conn->getServerAddress() );
- if( refManager && ! refManager->compatibleWith( manager, shard ) ){
- throw SendStaleConfigException( ns, str::stream() << "manager (" << manager->getVersion( shard ).toString() << " : " << manager->getSequenceNumber() << ") "
- << "not compatible with reference manager (" << refManager->getVersion( shard ).toString() << " : " << refManager->getSequenceNumber() << ") "
- << "on shard " << shard.getName() << " (" << shard.getAddress().toString() << ")",
- refManager->getVersion( shard ), manager->getVersion( shard ) );
+ if(refManager && !refManager->compatibleWith(*manager, shard.getName())) {
+ const ChunkVersion refVersion(refManager->getVersion(shard.getName()));
+ const ChunkVersion currentVersion(manager->getVersion(shard.getName()));
+ string msg(str::stream() << "manager ("
+ << currentVersion.toString()
+ << " : " << manager->getSequenceNumber() << ") "
+ << "not compatible with reference manager ("
+ << refVersion.toString()
+ << " : " << refManager->getSequenceNumber() << ") "
+ << "on shard " << shard.getName()
+ << " (" << shard.getAddress().toString() << ")");
+ throw SendStaleConfigException(ns,
+ msg,
+ refVersion,
+ currentVersion);
}
}
else if( refManager ){
@@ -241,8 +251,10 @@ namespace mongo {
<< "on conn " << conn->getServerAddress() << " ("
<< conn_in->getServerAddress() << ")" );
- throw SendStaleConfigException( ns, msg,
- refManager->getVersion( shard ), ChunkVersion( 0, 0, OID() ));
+ throw SendStaleConfigException(ns,
+ msg,
+ refManager->getVersion(shard.getName()),
+ ChunkVersion::UNSHARDED());
}
// has the ChunkManager been reloaded since the last time we updated the connection-level version?
@@ -252,9 +264,10 @@ namespace mongo {
return false;
}
- ChunkVersion version = ChunkVersion( 0, 0, OID() );
+ ChunkVersion version(0, 0, OID());
if ( isSharded && manager ) {
- version = manager->getVersion( Shard::make( conn->getServerAddress() ) );
+ Shard shard(Shard::make(conn->getServerAddress()));
+ version = manager->getVersion(shard.getName());
}
if( ! version.isSet() ){