From 6a6ef51ef5a447bbbc876a63ac96e58f0c8802a0 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 8 Jun 2020 16:42:24 +0000 Subject: [PATCH] optimization: generate children counts on demand Accumulating counts in the Node data structure takes a lot of effort, and it turns out we only use this information in a few places where it's easy to compute. --- render/detailed/summary.go | 5 +++-- render/expected/expected.go | 22 +--------------------- render/render.go | 3 --- report/metadata_template.go | 7 +++++-- report/node.go | 11 +++++++++++ 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/render/detailed/summary.go b/render/detailed/summary.go index e18cefd5a..aa26ef046 100644 --- a/render/detailed/summary.go +++ b/render/detailed/summary.go @@ -164,7 +164,7 @@ func MakeNodeSummary(rc RenderContext, n report.Node) (NodeSummary, bool) { Adjacency: n.Adjacency, } // Only include metadata, metrics, tables when it's not a group node - if _, ok := n.LookupCounter(n.Topology); !ok { + if n.CountChildrenOfTopology(n.Topology) == 0 { if topology, ok := rc.Topology(n.Topology); ok { summary.Metadata = topology.MetadataTemplates.MetadataRows(n) summary.Metrics = topology.MetricTemplates.MetricRows(n) @@ -432,9 +432,10 @@ func groupNodeSummary(base BasicNodeSummary, r report.Report, n report.Node) Bas } func pluralize(n report.Node, key, singular, plural string) string { + // either fetch a stored counter, or count the children directly c, ok := n.LookupCounter(key) if !ok { - c = 0 + c = n.CountChildrenOfTopology(key) } if c == 1 { return fmt.Sprintf("%d %s", c, singular) diff --git a/render/expected/expected.go b/render/expected/expected.go index efa9038f8..8ad25bfb5 100644 --- a/render/expected/expected.go +++ b/render/expected/expected.go @@ -113,7 +113,6 @@ var ( RenderedProcessNames = report.Nodes{ fixture.Client1Name: processNameNode(fixture.Client1Name, fixture.ServerName). WithLatests(map[string]string{process.Name: fixture.Client1Name}). - AddCounter(report.Process, 2). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -123,14 +122,12 @@ var ( fixture.ServerName: processNameNode(fixture.ServerName). WithLatests(map[string]string{process.Name: fixture.ServerName}). - AddCounter(report.Process, 1). WithChildren(report.MakeIDList( fixture.Server80NodeID, fixture.ServerProcessNodeID, )), fixture.NonContainerName: processNameNode(fixture.NonContainerName, render.OutgoingInternetID). - AddCounter(report.Process, 1). WithChildren(report.MakeIDList( fixture.NonContainerNodeID, fixture.NonContainerProcessNodeID, @@ -183,7 +180,6 @@ var ( WithLatests(map[string]string{ docker.ContainerHostname: fixture.ClientContainerHostname, }). - AddCounter(report.Container, 1). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -196,7 +192,6 @@ var ( WithLatests(map[string]string{ docker.ContainerHostname: fixture.ServerContainerHostname, }). - AddCounter(report.Container, 2). WithChildren(report.MakeIDList( fixture.Server80NodeID, fixture.ServerProcessNodeID, @@ -219,7 +214,6 @@ var ( docker.ImageID: fixture.ClientContainerImageID, docker.ImageName: fixture.ClientContainerImageName, }). - AddCounter(report.Container, 1). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -229,7 +223,6 @@ var ( )), ServerContainerImageNodeID: containerImage(ServerContainerImageNodeID). - AddCounter(report.Container, 2). WithChildren(report.MakeIDList( fixture.Server80NodeID, fixture.ServerProcessNodeID, @@ -248,13 +241,10 @@ var ( fixture.NonContainerNodeID, fixture.NonContainerProcessNodeID, fixture.ServerContainer2NodeID, - )). - AddCounter(report.Container, 1). - AddCounter(render.Pseudo, 1) + )) RenderedPods = report.Nodes{ fixture.ClientPodNodeID: pod(fixture.ClientPodNodeID, fixture.ServerPodNodeID). - AddCounter(report.Container, 1). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -264,7 +254,6 @@ var ( )), fixture.ServerPodNodeID: pod(fixture.ServerPodNodeID). - AddCounter(report.Container, 1). WithChildren(report.MakeIDList( fixture.Server80NodeID, fixture.ServerProcessNodeID, @@ -321,7 +310,6 @@ var ( RenderedPodServices = report.Nodes{ fixture.ServiceNodeID: service(fixture.ServiceNodeID, fixture.ServiceNodeID). - AddCounter(report.Pod, 2). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -345,10 +333,6 @@ var ( WithLatests(map[string]string{ report.HostName: fixture.ClientHostName, }). - AddCounter(report.Container, 1). - AddCounter(report.ContainerImage, 1). - AddCounter(report.Pod, 1). - AddCounter(report.Process, 2). WithChildren(report.MakeIDList( fixture.Client54001NodeID, fixture.Client54002NodeID, @@ -360,10 +344,6 @@ var ( )), fixture.ServerHostNodeID: hostNode(fixture.ServerHostNodeID, render.OutgoingInternetID). - AddCounter(report.Container, 2). - AddCounter(report.ContainerImage, 1). - AddCounter(report.Pod, 1). - AddCounter(report.Process, 2). WithChildren(report.MakeIDList( fixture.Server80NodeID, fixture.NonContainerNodeID, diff --git a/render/render.go b/render/render.go index 38d6d684a..80609c9d9 100644 --- a/render/render.go +++ b/render/render.go @@ -193,9 +193,6 @@ func (ret *joinResults) addUnmappedChild(m report.Node, id string, topology stri result = report.MakeNode(id).WithTopology(topology) } result = result.WithChildID(m.ID) - if m.Topology != report.Endpoint { // optimisation: we never look at endpoint counts - result = result.AddCounter(m.Topology, 1) - } ret.nodes[id] = result } diff --git a/report/metadata_template.go b/report/metadata_template.go index 40e9d6182..d62ff2d1f 100644 --- a/report/metadata_template.go +++ b/report/metadata_template.go @@ -71,8 +71,11 @@ func fromSets(n Node, key string) (string, bool) { } func fromCounters(n Node, key string) (string, bool) { - val, ok := n.LookupCounter(key) - return strconv.Itoa(val), ok + val := n.CountChildrenOfTopology(key) + if val == 0 { + return "", false + } + return strconv.Itoa(val), true } // MetadataRow is a row for the metadata table. diff --git a/report/node.go b/report/node.go index 5dd52d7b0..2afee8cf2 100644 --- a/report/node.go +++ b/report/node.go @@ -100,6 +100,17 @@ func (n Node) AddCounter(k string, value int) Node { return n.WithLatest(name, mtime.Now(), strconv.Itoa(value)) } +// CountChildrenOfTopology returns how many children have a particular topology +func (n Node) CountChildrenOfTopology(topology string) int { + count := 0 + for _, childID := range n.ChildIDs { + if ty, ok := NodeIDType(childID); ok && ty == topology { + count++ + } + } + return count +} + // WithSet returns a fresh copy of n, with set merged in at key. func (n Node) WithSet(key string, set StringSet) Node { n.Sets = n.Sets.Add(key, set)