Skip to content

Commit a2a01cb

Browse files
authored
GODRIVER-2628 optimize allocations in selectServerFromDescription (#1111)
1 parent dd15cfb commit a2a01cb

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

x/mongo/driver/topology/topology.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,19 @@ func (t *Topology) selectServerFromDescription(desc description.Topology,
558558
return desc.Servers, nil
559559
}
560560

561-
var allowed []description.Server
562-
for _, s := range desc.Servers {
561+
allowedIndexes := make([]int, 0, len(desc.Servers))
562+
for i, s := range desc.Servers {
563563
if s.Kind != description.Unknown {
564-
allowed = append(allowed, s)
564+
allowedIndexes = append(allowedIndexes, i)
565+
}
566+
}
567+
var allowed []description.Server
568+
if len(allowedIndexes) == len(desc.Servers) {
569+
allowed = desc.Servers
570+
} else {
571+
allowed = make([]description.Server, len(allowedIndexes))
572+
for i, idx := range allowedIndexes {
573+
allowed[i] = desc.Servers[idx]
565574
}
566575
}
567576

x/mongo/driver/topology/topology_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,3 +835,68 @@ func serverKindFromString(t *testing.T, s string) description.ServerKind {
835835

836836
return description.Unknown
837837
}
838+
839+
func BenchmarkSelectServerFromDescription(b *testing.B) {
840+
for _, bcase := range []struct {
841+
name string
842+
serversHook func(servers []description.Server)
843+
}{
844+
{
845+
name: "AllFit",
846+
serversHook: func(servers []description.Server) {},
847+
},
848+
{
849+
name: "AllButOneFit",
850+
serversHook: func(servers []description.Server) {
851+
servers[0].Kind = description.Unknown
852+
},
853+
},
854+
{
855+
name: "HalfFit",
856+
serversHook: func(servers []description.Server) {
857+
for i := 0; i < len(servers); i += 2 {
858+
servers[i].Kind = description.Unknown
859+
}
860+
},
861+
},
862+
{
863+
name: "OneFit",
864+
serversHook: func(servers []description.Server) {
865+
for i := 1; i < len(servers); i++ {
866+
servers[i].Kind = description.Unknown
867+
}
868+
},
869+
},
870+
} {
871+
bcase := bcase
872+
873+
b.Run(bcase.name, func(b *testing.B) {
874+
s := description.Server{
875+
Addr: address.Address("localhost:27017"),
876+
HeartbeatInterval: time.Duration(10) * time.Second,
877+
LastWriteTime: time.Date(2017, 2, 11, 14, 0, 0, 0, time.UTC),
878+
LastUpdateTime: time.Date(2017, 2, 11, 14, 0, 2, 0, time.UTC),
879+
Kind: description.Mongos,
880+
WireVersion: &description.VersionRange{Min: 0, Max: 5},
881+
}
882+
servers := make([]description.Server, 100)
883+
for i := 0; i < len(servers); i++ {
884+
servers[i] = s
885+
}
886+
bcase.serversHook(servers)
887+
desc := description.Topology{
888+
Servers: servers,
889+
}
890+
891+
timeout := make(chan time.Time)
892+
b.ResetTimer()
893+
b.RunParallel(func(p *testing.PB) {
894+
b.ReportAllocs()
895+
for p.Next() {
896+
var c Topology
897+
_, _ = c.selectServerFromDescription(desc, newServerSelectionState(selectNone, timeout))
898+
}
899+
})
900+
})
901+
}
902+
}

0 commit comments

Comments
 (0)