Merge pull request #35157 from hashicorp/jbardin/depends-on-references

Reduce redundant walks when resolving module `depends_on`
pull/35164/head
James Bardin 2 years ago committed by GitHub
commit 3845aa1a7d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -30,14 +30,21 @@ func (g *AcyclicGraph) DirectedGraph() Grapher {
// Returns a Set that includes every Vertex yielded by walking down from the
// provided starting Vertex v.
func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) {
func (g *AcyclicGraph) Ancestors(vs ...Vertex) (Set, error) {
s := make(Set)
memoFunc := func(v Vertex, d int) error {
s.Add(v)
return nil
}
if err := g.DepthFirstWalk(g.downEdgesNoCopy(v), memoFunc); err != nil {
start := make(Set)
for _, v := range vs {
for _, dep := range g.downEdgesNoCopy(v) {
start.Add(dep)
}
}
if err := g.DepthFirstWalk(start, memoFunc); err != nil {
return nil, err
}
@ -46,14 +53,21 @@ func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) {
// Returns a Set that includes every Vertex yielded by walking up from the
// provided starting Vertex v.
func (g *AcyclicGraph) Descendents(v Vertex) (Set, error) {
func (g *AcyclicGraph) Descendents(vs ...Vertex) (Set, error) {
s := make(Set)
memoFunc := func(v Vertex, d int) error {
s.Add(v)
return nil
}
if err := g.ReverseDepthFirstWalk(g.upEdgesNoCopy(v), memoFunc); err != nil {
start := make(Set)
for _, v := range vs {
for _, dep := range g.upEdgesNoCopy(v) {
start.Add(dep)
}
}
if err := g.ReverseDepthFirstWalk(start, memoFunc); err != nil {
return nil, err
}

@ -437,17 +437,18 @@ func (m ReferenceMap) parentModuleDependsOn(g *Graph, depender graphNodeDependsO
deps, fromParentModule := m.dependsOn(g, mod)
for _, dep := range deps {
// add the dependency
res = append(res, dep)
// and check any transitive resource dependencies for more resources
ans, _ := g.Ancestors(dep)
for _, v := range ans {
if isDependableResource(v) {
res = append(res, v)
}
if isDependableResource(dep) {
res = append(res, dep)
}
}
ans, _ := g.Ancestors(deps...)
for _, v := range ans {
if isDependableResource(v) {
res = append(res, v)
}
}
fromModule = fromModule || fromParentModule
}

Loading…
Cancel
Save