diff --git a/render/container.go b/render/container.go index 347d56745..39b9e52b3 100644 --- a/render/container.go +++ b/render/container.go @@ -275,7 +275,7 @@ func (m containerImageRenderer) Render(ctx context.Context, rpt report.Report) N id := report.MakeContainerImageNodeID(imageID) ret.addChildAndChildren(n, id, report.ContainerImage) } - return ret.result(containers) + return ret.result(ctx, containers) } func containerImageNodeID(n report.Node) string { @@ -328,5 +328,5 @@ func (m containerHostnameRenderer) Render(ctx context.Context, rpt report.Report } ret.addChildAndChildren(n, id, containerHostnameTopology) } - return ret.result(containers) + return ret.result(ctx, containers) } diff --git a/render/endpoint.go b/render/endpoint.go index c645bb995..ab57180d4 100644 --- a/render/endpoint.go +++ b/render/endpoint.go @@ -47,5 +47,5 @@ func (e mapEndpoints) Render(ctx context.Context, rpt report.Report) Nodes { ret.addChild(n, id, e.topology) } } - return ret.result(endpoints) + return ret.result(ctx, endpoints) } diff --git a/render/filters.go b/render/filters.go index 0daa6fbe7..4144ace4c 100644 --- a/render/filters.go +++ b/render/filters.go @@ -17,7 +17,7 @@ const ( // in one call - useful for functions that need to consider the entire graph. // We should minimise the use of this renderer type, as it is very inflexible. type CustomRenderer struct { - RenderFunc func(Nodes) Nodes + RenderFunc func(context.Context, Nodes) Nodes Renderer } @@ -26,7 +26,7 @@ func (c CustomRenderer) Render(ctx context.Context, rpt report.Report) Nodes { if ctx.Err() != nil { return Nodes{} } - return c.RenderFunc(c.Renderer.Render(ctx, rpt)) + return c.RenderFunc(ctx, c.Renderer.Render(ctx, rpt)) } // FilterFunc is the function type used by Filters @@ -189,7 +189,7 @@ func filterInternetAdjacencies(nodes report.Nodes) { func ColorConnected(r Renderer) Renderer { return CustomRenderer{ Renderer: r, - RenderFunc: func(input Nodes) Nodes { + RenderFunc: func(ctx context.Context, input Nodes) Nodes { output := input.Copy() for id := range connected(input.Nodes) { output[id] = output[id].WithLatest(IsConnectedMark, mtime.Now(), "true") diff --git a/render/host.go b/render/host.go index 26a4c5cc7..742dc9b3e 100644 --- a/render/host.go +++ b/render/host.go @@ -1,6 +1,8 @@ package render import ( + "context" + "github.com/weaveworks/scope/report" ) @@ -25,7 +27,7 @@ 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 nodes2Hosts(nodes Nodes) Nodes { +func nodes2Hosts(ctx context.Context, nodes Nodes) Nodes { ret := newJoinResults(nil) for _, n := range nodes.Nodes { @@ -47,7 +49,7 @@ func nodes2Hosts(nodes Nodes) Nodes { } } } - return ret.result(nodes) + return ret.result(ctx, nodes) } func endpoint2Host(n report.Node) string { diff --git a/render/pod.go b/render/pod.go index 2b5beb9e2..321c588ad 100644 --- a/render/pod.go +++ b/render/pod.go @@ -197,5 +197,5 @@ func (m Map2Parent) Render(ctx context.Context, rpt report.Report) Nodes { ret.addChildAndChildren(n, id, Pseudo) } } - return ret.result(input) + return ret.result(ctx, input) } diff --git a/render/process.go b/render/process.go index 2cce7dc0d..4b5c1c7d9 100644 --- a/render/process.go +++ b/render/process.go @@ -95,7 +95,7 @@ func hasMoreThanOneConnection(n report.Node, endpoints report.Nodes) bool { var processNameTopology = MakeGroupNodeTopology(report.Process, report.Name) // processes2Names maps process Nodes to Nodes for each process name. -func processes2Names(processes Nodes) Nodes { +func processes2Names(ctx context.Context, processes Nodes) Nodes { ret := newJoinResults(nil) for _, n := range processes.Nodes { @@ -105,5 +105,5 @@ func processes2Names(processes Nodes) Nodes { ret.addChildAndChildren(n, name, processNameTopology) } } - return ret.result(processes) + return ret.result(ctx, processes) } diff --git a/render/render.go b/render/render.go index efeea1fdd..025e86c10 100644 --- a/render/render.go +++ b/render/render.go @@ -133,7 +133,7 @@ func (m Map) Render(ctx context.Context, rpt report.Report) Nodes { span.LogFields(otlog.Int("input.nodes", len(input.Nodes)), otlog.Int("ouput.nodes", len(output.nodes))) - return output.result(input) + return output.result(ctx, input) } // Condition is a predecate over the entire report that can evaluate to true or false. @@ -233,8 +233,11 @@ func (ret *joinResults) passThrough(n report.Node) { // Rewrite Adjacency of nodes in ret mapped from original nodes in // input, and return the result. -func (ret *joinResults) result(input Nodes) Nodes { +func (ret *joinResults) result(ctx context.Context, input Nodes) Nodes { for _, n := range input.Nodes { + if ctx.Err() != nil { // check if cancelled + return Nodes{} + } outID, ok := ret.mapped[n.ID] if !ok { continue