diff --git a/x/mongo/driver/topology/topology.go b/x/mongo/driver/topology/topology.go index ccb154b9e9..4b60ad2abd 100644 --- a/x/mongo/driver/topology/topology.go +++ b/x/mongo/driver/topology/topology.go @@ -809,24 +809,27 @@ func equalTopologies(topo1, topo2 description.Topology) bool { return false } - topoServers := make(map[string]description.Server, len(topo1.Servers)) - for _, s := range topo1.Servers { - topoServers[s.Addr.String()] = s + topoServers := make(map[string]*description.Server, len(topo1.Servers)) + for i := range topo1.Servers { + topoServers[topo1.Servers[i].Addr.String()] = &topo1.Servers[i] } - otherServers := make(map[string]description.Server, len(topo2.Servers)) - for _, s := range topo2.Servers { - otherServers[s.Addr.String()] = s + otherServers := make(map[string]*description.Server, len(topo2.Servers)) + for i := range topo2.Servers { + otherServers[topo2.Servers[i].Addr.String()] = &topo2.Servers[i] } if len(topoServers) != len(otherServers) { return false } - for _, server := range topoServers { - otherServer := otherServers[server.Addr.String()] + for addr, server := range topoServers { + otherServer, ok := otherServers[addr] + if !ok { + return false + } - if !driverutil.EqualServers(server, otherServer) { + if !driverutil.EqualServers(*server, *otherServer) { return false } } diff --git a/x/mongo/driver/topology/topology_test.go b/x/mongo/driver/topology/topology_test.go index b95c84fc54..e2a54dc05e 100644 --- a/x/mongo/driver/topology/topology_test.go +++ b/x/mongo/driver/topology/topology_test.go @@ -12,6 +12,7 @@ import ( "fmt" "io/ioutil" "path" + "strconv" "sync/atomic" "testing" "time" @@ -1040,3 +1041,57 @@ func BenchmarkSelectServerFromDescription(b *testing.B) { }) } } + +func TestEqualTopologies(t *testing.T) { + assert.True(t, equalTopologies( + description.Topology{ + Servers: []description.Server{{ + Addr: "127.0.0.1:27017", + }}, + }, description.Topology{ + Servers: []description.Server{{ + Addr: "127.0.0.1:27017", + }}, + }, + )) + assert.False(t, equalTopologies( + description.Topology{ + Servers: []description.Server{{ + Addr: "127.0.0.1:27017", + }}, + }, description.Topology{ + Servers: []description.Server{{ + Addr: "127.0.0.2:27017", + }}, + }, + )) +} + +func BenchmarkEqualTopologies(b *testing.B) { + for _, bsize := range []int{10, 100, 1000} { + b.Run(strconv.Itoa(bsize), func(b *testing.B) { + servers := make([]description.Server, bsize) + for i := 0; i < len(servers); i++ { + servers[i] = description.Server{ + Addr: address.Address("127.0.0." + strconv.Itoa(i) + ":27017"), + HeartbeatInterval: time.Duration(10) * time.Second, + LastWriteTime: time.Date(2017, 2, 11, 14, 0, 0, 0, time.UTC), + LastUpdateTime: time.Date(2017, 2, 11, 14, 0, 2, 0, time.UTC), + Kind: description.ServerKindMongos, + WireVersion: &description.VersionRange{Min: 6, Max: 21}, + } + } + desc := description.Topology{ + Servers: servers, + } + + b.ResetTimer() + b.RunParallel(func(p *testing.PB) { + b.ReportAllocs() + for p.Next() { + _ = equalTopologies(desc, desc) + } + }) + }) + } +}