mirror of
https://github.com/weaveworks/scope.git
synced 2026-05-05 16:59:36 +00:00
The rendering code checks whether endpoint IPs are part of cluster-local networks. Due to the prevalence of endpoints - medium sized reports can contain many thousands of endpoints - this is performance critical. Alas the existing code performs the check via a linear scan of a list of networks. That is slow when there are more than a few, which will be the case in the context of k8s, since there the probes register service IPs as local /32 networks. Here we change representation of the set of networks to a prefix tree (aka trie), which is well-suited for IP network membership checks since networks are in fact a bitstring prefixes. The specific representation is a crit-bit tree, but that choice was purely based on implementation convenience - the chosen library is the only one I could find that directly supports IP networks.
26 lines
490 B
Go
26 lines
490 B
Go
package report_test
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
func TestContains(t *testing.T) {
|
|
networks := report.NewNetworks()
|
|
for _, cidr := range []string{"10.0.0.1/8", "192.168.1.1/24"} {
|
|
if err := networks.AddCIDR(cidr); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
if networks.Contains(net.ParseIP("52.52.52.52")) {
|
|
t.Errorf("52.52.52.52 not in %v", networks)
|
|
}
|
|
|
|
if !networks.Contains(net.ParseIP("10.0.0.1")) {
|
|
t.Errorf("10.0.0.1 in %v", networks)
|
|
}
|
|
}
|