diff options
-rw-r--r-- | src/mongo/client/dbclient.cpp | 20 | ||||
-rw-r--r-- | src/mongo/client/dbclientinterface.h | 6 | ||||
-rw-r--r-- | src/mongo/s/shard.h | 5 | ||||
-rw-r--r-- | src/mongo/s/shard_test.cpp | 13 |
4 files changed, 32 insertions, 12 deletions
diff --git a/src/mongo/client/dbclient.cpp b/src/mongo/client/dbclient.cpp index 25457410344..1b64f4bf883 100644 --- a/src/mongo/client/dbclient.cpp +++ b/src/mongo/client/dbclient.cpp @@ -160,8 +160,6 @@ namespace mongo { switch ( _type ) { case INVALID: - // both are invalid - // I think that should be == return true; case MASTER: return _servers[0] == other._servers[0]; @@ -172,11 +170,23 @@ namespace mongo { ( _servers[0] == other._servers[1] ) && ( _servers[1] == other._servers[0] ); case SET: - // should this also make sure at least one host overlaps? return _setName == other._setName; case SYNC: - // should this check the _servers array instead? - return _string == other._string; + // The servers all have to be the same in each, but not in the same order. + if ( _servers.size() != other._servers.size() ) + return false; + for ( unsigned i = 0; i < _servers.size(); i++ ) { + bool found = false; + for ( unsigned j = 0; j < other._servers.size(); j++ ) { + if ( _servers[i] == other._servers[j] ) { + found = true; + break; + } + } + if ( ! found ) + return false; + } + return true; case CUSTOM: return _string == other._string; } diff --git a/src/mongo/client/dbclientinterface.h b/src/mongo/client/dbclientinterface.h index a47625c6cff..cb0df4e1aaa 100644 --- a/src/mongo/client/dbclientinterface.h +++ b/src/mongo/client/dbclientinterface.h @@ -249,9 +249,9 @@ namespace mongo { ConnectionType type() const { return _type; } /** - * this returns true if this and other point to the same logical entity - * for single nodes, thats the same address - * for replica sets, thats the same name + * This returns true if this and other point to the same logical entity. + * For single nodes, thats the same address. + * For replica sets, thats just the same replica set name. */ bool sameLogicalEndpoint( const ConnectionString& other ) const; diff --git a/src/mongo/s/shard.h b/src/mongo/s/shard.h index c02869e85d3..7a7e0d8fbda 100644 --- a/src/mongo/s/shard.h +++ b/src/mongo/s/shard.h @@ -99,8 +99,9 @@ namespace mongo { } bool operator==( const Shard& s ) const { - bool n = _name == s._name; - return n && _cs.sameLogicalEndpoint( s._cs ); + if ( _name != s._name ) + return false; + return _cs.sameLogicalEndpoint( s._cs ); } bool operator!=( const Shard& s ) const { diff --git a/src/mongo/s/shard_test.cpp b/src/mongo/s/shard_test.cpp index 413f8ab6f07..cbe273cde14 100644 --- a/src/mongo/s/shard_test.cpp +++ b/src/mongo/s/shard_test.cpp @@ -42,7 +42,7 @@ namespace mongo { // ----------------------------------- - TEST( Shard, Simple1 ) { + TEST( Shard, EqualityRs ) { Shard a( "foo", "bar/a,b" ); Shard b( "foo", "bar/a,b" ); ASSERT_EQUALS( a, b ); @@ -51,10 +51,19 @@ namespace mongo { ASSERT_EQUALS( a, b ); } - TEST( Shard, Simple2 ) { + TEST( Shard, EqualitySingle ) { ASSERT_EQUALS( Shard( "foo", "b.foo.com:123"), Shard( "foo", "b.foo.com:123") ); ASSERT_NOT_EQUALS( Shard( "foo", "b.foo.com:123"), Shard( "foo", "a.foo.com:123") ); ASSERT_NOT_EQUALS( Shard( "foo", "b.foo.com:123"), Shard( "foo", "b.foo.com:124") ); ASSERT_NOT_EQUALS( Shard( "foo", "b.foo.com:123"), Shard( "foa", "b.foo.com:123") ); } + + TEST( Shard, EqualitySync ) { + ConnectionString cs( ConnectionString::SYNC, "a,b,c" ); + ASSERT( cs.sameLogicalEndpoint( ConnectionString( ConnectionString::SYNC, "a,b,c" ) ) ); + ASSERT( cs.sameLogicalEndpoint( ConnectionString( ConnectionString::SYNC, "c,b,a" ) ) ); + ASSERT( cs.sameLogicalEndpoint( ConnectionString( ConnectionString::SYNC, "c,a,b" ) ) ); + + ASSERT( ! cs.sameLogicalEndpoint( ConnectionString( ConnectionString::SYNC, "d,a,b" ) ) ); + } } |