diff options
author | Randolph Tan <randolph@10gen.com> | 2014-10-06 17:36:18 -0400 |
---|---|---|
committer | Randolph Tan <randolph@10gen.com> | 2014-10-15 11:03:20 -0400 |
commit | 126069374744c62c65fac86a492531d658961f40 (patch) | |
tree | 9ea6d5070815c5e1dba6119cee7dcf19b4aaf67c /src/mongo/s/version_manager.cpp | |
parent | 8cbf581a2694c496681b8fd12e2cc03747358869 (diff) | |
download | mongo-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.cpp | 31 |
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() ){ |