From fa03a0be081ffb9a11279e91a25e0ecbe2c8afce Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sat, 11 Nov 2017 14:19:46 +0000 Subject: [PATCH] Rewrite MapX2Host as a RenderFunc using joinResults It's more efficient as many input Nodes map onto a few hosts. --- render/host.go | 56 ++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/render/host.go b/render/host.go index 19e1fb6a1..ec50dc03e 100644 --- a/render/host.go +++ b/render/host.go @@ -10,26 +10,14 @@ import ( // not memoised var HostRenderer = MakeReduce( endpoints2Hosts{}, - MakeMap( - MapX2Host, - ColorConnectedProcessRenderer, - ), - MakeMap( - MapX2Host, - ContainerRenderer, - ), - MakeMap( - MapX2Host, - ContainerImageRenderer, - ), - MakeMap( - MapX2Host, - PodRenderer, - ), + CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ColorConnectedProcessRenderer}, + CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerRenderer}, + CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerImageRenderer}, + CustomRenderer{RenderFunc: nodes2Hosts, Renderer: PodRenderer}, SelectHost, ) -// MapX2Host maps any Nodes to host Nodes. +// nodes2Hosts maps any Nodes to host Nodes. // // If this function is given a node without a hostname // (including other pseudo nodes), it will drop the node. @@ -38,27 +26,23 @@ var HostRenderer = MakeReduce( // format for a host, but without any Major or Minor labels. It does // not have enough info to do that, and the resulting graph must be // merged with a host graph to get that info. -func MapX2Host(n report.Node, _ report.Networks) report.Nodes { - // Don't propagate pseudo nodes - we do this in MapEndpoint2Host - if n.Topology == Pseudo { - return report.Nodes{} - } +func nodes2Hosts(nodes Nodes) Nodes { + ret := newJoinResults() - hostIDs, ok := n.Parents.Lookup(report.Host) - if !ok { - return report.Nodes{} + for _, n := range nodes.Nodes { + if n.Topology == Pseudo { + continue // Don't propagate pseudo nodes - we do this in MapEndpoint2Host + } else { + hostIDs, _ := n.Parents.Lookup(report.Host) + for _, id := range hostIDs { + ret.addToResults(n, id, false, func(id string) report.Node { + return report.MakeNode(id).WithTopology(report.Host) + }, n.Topology) + } + } } - - result := report.Nodes{} - children := report.MakeNodeSet(n) - for _, id := range hostIDs { - node := NewDerivedNode(id, n).WithTopology(report.Host) - node.Counters = node.Counters.Add(n.Topology, 1) - node.Children = children - result[id] = node - } - - return result + ret.fixupAdjacencies(nodes) + return ret.result() } // endpoints2Hosts takes nodes from the endpoint topology and produces