Rewrite MapX2Host as a RenderFunc using joinResults

It's more efficient as many input Nodes map onto a few hosts.
This commit is contained in:
Bryan Boreham
2017-11-11 14:19:46 +00:00
committed by Matthias Radestock
parent db41cab0af
commit fa03a0be08

View File

@@ -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