From e7bd4b9e0619d45f8b53caff3cccd387e2214960 Mon Sep 17 00:00:00 2001 From: Ivan Sopov Date: Thu, 10 Apr 2025 19:24:12 +0300 Subject: [PATCH 1/4] use pointers to optimise equalTopologies func --- x/mongo/driver/topology/topology.go | 14 ++++++------- x/mongo/driver/topology/topology_test.go | 26 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/x/mongo/driver/topology/topology.go b/x/mongo/driver/topology/topology.go index ccb154b9e9..a13e9db5b6 100644 --- a/x/mongo/driver/topology/topology.go +++ b/x/mongo/driver/topology/topology.go @@ -809,14 +809,14 @@ 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) { @@ -826,7 +826,7 @@ func equalTopologies(topo1, topo2 description.Topology) bool { for _, server := range topoServers { otherServer := otherServers[server.Addr.String()] - 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..d7cca59291 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,28 @@ func BenchmarkSelectServerFromDescription(b *testing.B) { }) } } + +func BenchmarkEqualTopologies(b *testing.B) { + servers := make([]description.Server, 100) + 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) + } + }) +} From ddc19ee3099be33c6f70ab2ece7feaa914fac965 Mon Sep 17 00:00:00 2001 From: Ivan Sopov Date: Fri, 11 Apr 2025 16:30:58 +0300 Subject: [PATCH 2/4] fix NPD --- x/mongo/driver/topology/topology.go | 5 ++++- x/mongo/driver/topology/topology_test.go | 25 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/x/mongo/driver/topology/topology.go b/x/mongo/driver/topology/topology.go index a13e9db5b6..9d25b81f5c 100644 --- a/x/mongo/driver/topology/topology.go +++ b/x/mongo/driver/topology/topology.go @@ -824,7 +824,10 @@ func equalTopologies(topo1, topo2 description.Topology) bool { } for _, server := range topoServers { - otherServer := otherServers[server.Addr.String()] + otherServer, ok := otherServers[server.Addr.String()] + if !ok { + return false + } 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 d7cca59291..a4a608e8eb 100644 --- a/x/mongo/driver/topology/topology_test.go +++ b/x/mongo/driver/topology/topology_test.go @@ -1042,6 +1042,31 @@ 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) { servers := make([]description.Server, 100) for i := 0; i < len(servers); i++ { From 1f576bc13be4300d76503c97655db4caef8384b3 Mon Sep 17 00:00:00 2001 From: Ivan Sopov Date: Mon, 14 Apr 2025 13:31:30 +0300 Subject: [PATCH 3/4] do not recompute canonical addr --- x/mongo/driver/topology/topology.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/mongo/driver/topology/topology.go b/x/mongo/driver/topology/topology.go index 9d25b81f5c..4b60ad2abd 100644 --- a/x/mongo/driver/topology/topology.go +++ b/x/mongo/driver/topology/topology.go @@ -823,8 +823,8 @@ func equalTopologies(topo1, topo2 description.Topology) bool { return false } - for _, server := range topoServers { - otherServer, ok := otherServers[server.Addr.String()] + for addr, server := range topoServers { + otherServer, ok := otherServers[addr] if !ok { return false } From f495782ab06a0cb1ed4bc5152520dd27133e48ad Mon Sep 17 00:00:00 2001 From: Ivan Sopov Date: Fri, 18 Apr 2025 16:09:48 +0300 Subject: [PATCH 4/4] benchmark with 3 different server slice sizes --- x/mongo/driver/topology/topology_test.go | 46 +++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/x/mongo/driver/topology/topology_test.go b/x/mongo/driver/topology/topology_test.go index a4a608e8eb..e2a54dc05e 100644 --- a/x/mongo/driver/topology/topology_test.go +++ b/x/mongo/driver/topology/topology_test.go @@ -1068,26 +1068,30 @@ func TestEqualTopologies(t *testing.T) { } func BenchmarkEqualTopologies(b *testing.B) { - servers := make([]description.Server, 100) - 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, - } + 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) - } - }) + b.ResetTimer() + b.RunParallel(func(p *testing.PB) { + b.ReportAllocs() + for p.Next() { + _ = equalTopologies(desc, desc) + } + }) + }) + } }