Skip to content

Commit

Permalink
Merge pull request #35157 from hashicorp/jbardin/depends-on-references
Browse files Browse the repository at this point in the history
Reduce redundant walks when resolving module `depends_on`
  • Loading branch information
jbardin committed May 15, 2024
2 parents dc3a040 + f41a1fb commit 3845aa1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
22 changes: 18 additions & 4 deletions internal/dag/dag.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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
}

Expand Down
19 changes: 10 additions & 9 deletions internal/terraform/transform_reference.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down

0 comments on commit 3845aa1

Please sign in to comment.