Skip to content

Commit dd15cfb

Browse files
authored
GODRIVER-2626 further optimize selectByKind for special case of all fitting servers (#1107)
1 parent 1a7f496 commit dd15cfb

File tree

2 files changed

+64
-24
lines changed

2 files changed

+64
-24
lines changed

mongo/description/selector_test.go

+61-24
Original file line numberDiff line numberDiff line change
@@ -300,32 +300,69 @@ func BenchmarkLatencySelector(b *testing.B) {
300300
}
301301

302302
func BenchmarkSelector_Sharded(b *testing.B) {
303-
subject := readpref.Primary()
303+
for _, bcase := range []struct {
304+
name string
305+
serversHook func(servers []Server)
306+
}{
307+
{
308+
name: "AllFit",
309+
serversHook: func(servers []Server) {},
310+
},
311+
{
312+
name: "AllButOneFit",
313+
serversHook: func(servers []Server) {
314+
servers[0].Kind = LoadBalancer
315+
},
316+
},
317+
{
318+
name: "HalfFit",
319+
serversHook: func(servers []Server) {
320+
for i := 0; i < len(servers); i += 2 {
321+
servers[i].Kind = LoadBalancer
322+
}
323+
},
324+
},
325+
{
326+
name: "OneFit",
327+
serversHook: func(servers []Server) {
328+
for i := 1; i < len(servers); i++ {
329+
servers[i].Kind = LoadBalancer
330+
}
331+
},
332+
},
333+
} {
334+
bcase := bcase
304335

305-
s := Server{
306-
Addr: address.Address("localhost:27017"),
307-
HeartbeatInterval: time.Duration(10) * time.Second,
308-
LastWriteTime: time.Date(2017, 2, 11, 14, 0, 0, 0, time.UTC),
309-
LastUpdateTime: time.Date(2017, 2, 11, 14, 0, 2, 0, time.UTC),
310-
Kind: Mongos,
311-
WireVersion: &VersionRange{Min: 0, Max: 5},
312-
}
313-
servers := make([]Server, 100)
314-
for i := 0; i < len(servers); i++ {
315-
servers[i] = s
316-
}
317-
servers[0].Kind = LoadBalancer
318-
c := Topology{
319-
Kind: Sharded,
320-
Servers: servers,
321-
}
336+
b.Run(bcase.name, func(b *testing.B) {
337+
subject := readpref.Primary()
322338

323-
b.ResetTimer()
324-
b.RunParallel(func(p *testing.PB) {
325-
for p.Next() {
326-
_, _ = ReadPrefSelector(subject).SelectServer(c, c.Servers)
327-
}
328-
})
339+
s := Server{
340+
Addr: address.Address("localhost:27017"),
341+
HeartbeatInterval: time.Duration(10) * time.Second,
342+
LastWriteTime: time.Date(2017, 2, 11, 14, 0, 0, 0, time.UTC),
343+
LastUpdateTime: time.Date(2017, 2, 11, 14, 0, 2, 0, time.UTC),
344+
Kind: Mongos,
345+
WireVersion: &VersionRange{Min: 0, Max: 5},
346+
}
347+
servers := make([]Server, 100)
348+
for i := 0; i < len(servers); i++ {
349+
servers[i] = s
350+
}
351+
bcase.serversHook(servers)
352+
c := Topology{
353+
Kind: Sharded,
354+
Servers: servers,
355+
}
356+
357+
b.ResetTimer()
358+
b.RunParallel(func(p *testing.PB) {
359+
b.ReportAllocs()
360+
for p.Next() {
361+
_, _ = ReadPrefSelector(subject).SelectServer(c, c.Servers)
362+
}
363+
})
364+
})
365+
}
329366
}
330367

331368
func TestSelector_Single(t *testing.T) {

mongo/description/server_selector.go

+3
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ func selectByKind(candidates []Server, kind ServerKind) []Server {
310310
viableIndexes = append(viableIndexes, i)
311311
}
312312
}
313+
if len(viableIndexes) == len(candidates) {
314+
return candidates
315+
}
313316
result := make([]Server, len(viableIndexes))
314317
for i, idx := range viableIndexes {
315318
result[i] = candidates[idx]

0 commit comments

Comments
 (0)