mirror of
https://github.com/coredns/coredns.git
synced 2026-08-20 23:08:28 -04:00
* perf(loadbalance): fast-path zero-allocation roundRobin for homogeneous record sets Signed-off-by: Manuel Rüger <manuel@rueg.eu> * plugin/loadbalance: copy before shuffling in the fast path The fast path shuffled the caller's slice in place, which is not safe. roundRobin must not modify its input: a backend may hand back a slice it owns rather than one built for the response. plugin/file does exactly that - Lookup returns elem.Type(qtype), which is the zone tree's own []dns.RR - so an in-place shuffle reorders the zone itself, visible to every other query and racing with the ones running concurrently. Copy the records into a fresh slice and shuffle that instead. This is still a single allocation rather than the four slices the partitioning path builds, so most of the gain is kept: name old time/op new time/op delta RoundRobin 353 ns 244 ns -31% name old alloc/op new alloc/op delta RoundRobin 118 B 54 B -54% name old allocs/op new allocs/op delta RoundRobin 5 4 -20% Also reorder the type check so a response led by a CNAME is rejected on the first record instead of scanning the whole answer section first. TestRoundRobinDoesNotMutateInput pins the contract; it fails against the in-place version. Signed-off-by: Manuel Rüger <manuel@rueg.eu> --------- Signed-off-by: Manuel Rüger <manuel@rueg.eu>
2.8 KiB
2.8 KiB