no longer need DestroyValueReferenceTransformer

since destroy nodes are no longer connected to values, there's no need
to try and wrangle their edges to prevent cycles during destroy.
This commit is contained in:
James Bardin 2019-12-04 09:36:48 -05:00
parent dc8cdd260c
commit ca5b0e6894
3 changed files with 1 additions and 43 deletions

View File

@ -171,14 +171,10 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer {
Destroy: b.Destroy, Destroy: b.Destroy,
}, },
// Handle destroy time transformations for output and local values.
// Reverse the edges from outputs and locals, so that
// interpolations don't fail during destroy.
// Create a destroy node for outputs to remove them from the state.
GraphTransformIf( GraphTransformIf(
func() bool { return b.Destroy }, func() bool { return b.Destroy },
GraphTransformMulti( GraphTransformMulti(
&DestroyValueReferenceTransformer{}, // Create a destroy node for outputs to remove them from the state.
&DestroyOutputTransformer{}, &DestroyOutputTransformer{},
), ),
), ),

View File

@ -56,7 +56,6 @@ func (t *DestroyEdgeTransformer) Transform(g *Graph) error {
// Build a map of what is being destroyed (by address string) to // Build a map of what is being destroyed (by address string) to
// the list of destroyers. // the list of destroyers.
destroyers := make(map[string][]GraphNodeDestroyer) destroyers := make(map[string][]GraphNodeDestroyer)
destroyerAddrs := make(map[string]addrs.AbsResourceInstance)
// Record the creators, which will need to depend on the destroyers if they // Record the creators, which will need to depend on the destroyers if they
// are only being updated. // are only being updated.
@ -79,7 +78,6 @@ func (t *DestroyEdgeTransformer) Transform(g *Graph) error {
key := addr.String() key := addr.String()
log.Printf("[TRACE] DestroyEdgeTransformer: %q (%T) destroys %s", dag.VertexName(n), v, key) log.Printf("[TRACE] DestroyEdgeTransformer: %q (%T) destroys %s", dag.VertexName(n), v, key)
destroyers[key] = append(destroyers[key], n) destroyers[key] = append(destroyers[key], n)
destroyerAddrs[key] = addr
resAddr := addr.Resource.Resource.Absolute(addr.Module).String() resAddr := addr.Resource.Resource.Absolute(addr.Module).String()
destroyersByResource[resAddr] = append(destroyersByResource[resAddr], n) destroyersByResource[resAddr] = append(destroyersByResource[resAddr], n)

View File

@ -176,42 +176,6 @@ func (t AttachDependenciesTransformer) Transform(g *Graph) error {
return nil return nil
} }
// DestroyReferenceTransformer is a GraphTransformer that reverses the edges
// for locals and outputs that depend on other nodes which will be
// removed during destroy. If a destroy node is evaluated before the local or
// output value, it will be removed from the state, and the later interpolation
// will fail.
type DestroyValueReferenceTransformer struct{}
func (t *DestroyValueReferenceTransformer) Transform(g *Graph) error {
vs := g.Vertices()
for _, v := range vs {
switch v.(type) {
case *NodeApplyableOutput, *NodeLocal:
// OK
default:
continue
}
// reverse any outgoing edges so that the value is evaluated first.
for _, e := range g.EdgesFrom(v) {
target := e.Target()
// only destroy nodes will be evaluated in reverse
if _, ok := target.(GraphNodeDestroyer); !ok {
continue
}
log.Printf("[TRACE] output dep: %s", dag.VertexName(target))
g.RemoveEdge(e)
g.Connect(dag.BasicEdge(target, v))
}
}
return nil
}
// PruneUnusedValuesTransformer is a GraphTransformer that removes local, // PruneUnusedValuesTransformer is a GraphTransformer that removes local,
// variable, and output values which are not referenced in the graph. If these // variable, and output values which are not referenced in the graph. If these
// values reference a resource that is no longer in the state the interpolation // values reference a resource that is no longer in the state the interpolation