Skip to content

Commit

Permalink
Merge pull request #2978 from weaveworks/2943-map-nats
Browse files Browse the repository at this point in the history
don't exclude NATed connections in mapping to processes

Fixes #2943
  • Loading branch information
rade authored Dec 15, 2017
2 parents dacf284 + 20138b9 commit ae09b1c
Showing 1 changed file with 29 additions and 5 deletions.
34 changes: 29 additions & 5 deletions render/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package render

import (
"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/probe/endpoint"
"github.com/weaveworks/scope/probe/process"
"github.com/weaveworks/scope/report"
)
Expand Down Expand Up @@ -98,11 +99,7 @@ func (e endpoints2Processes) Render(rpt report.Report) Nodes {
if !ok {
continue
}

if len(n.Adjacency) > 1 {
// We cannot be sure that the pid is associated with all the
// connections. It is better to drop such an endpoint than
// risk rendering bogus connections.
if hasMoreThanOneConnection(n, endpoints.Nodes) {
continue
}

Expand All @@ -124,6 +121,33 @@ func (e endpoints2Processes) Render(rpt report.Report) Nodes {
return ret.result()
}

// When there is more than one connection originating from a source
// endpoint, we cannot be sure that its pid is associated with all of
// them, since the source endpoint may have been re-used by a
// different process. See #2665. It is better to drop such an endpoint
// than risk rendering bogus connections. Aliased connections - when
// all the remote endpoints represent the same logical endpoint, due
// to NATing - are fine though.
func hasMoreThanOneConnection(n report.Node, endpoints report.Nodes) bool {
if len(n.Adjacency) < 2 {
return false
}
firstRealEndpointID := ""
for _, endpointID := range n.Adjacency {
if ep, ok := endpoints[endpointID]; ok {
if copyID, _, ok := ep.Latest.LookupEntry(endpoint.CopyOf); ok {
endpointID = copyID
}
}
if firstRealEndpointID == "" {
firstRealEndpointID = endpointID
} else if firstRealEndpointID != endpointID {
return true
}
}
return false
}

// processes2Names maps process Nodes to Nodes for each process name.
func processes2Names(processes Nodes) Nodes {
ret := newJoinResults()
Expand Down

0 comments on commit ae09b1c

Please sign in to comment.