From b6a67f622fae7005518c3a865f18adab56e4de8c Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 17 Nov 2022 11:01:46 -0500 Subject: [PATCH] check walkDestroy to help DestroyEdgeTransformer In a heavily-connected graph with lots of inter-dependent providers, the cycle checks for destroy edges across providers can seriously impact performance. Since the specific cases we need to avoid will involve create/update nodes, skip the extra checks during a full destroy operation. Once we find a way to better track these dependencies, the transformer will not need to do the cycle checks in the first place. --- internal/terraform/graph_builder_apply.go | 3 ++- internal/terraform/transform_destroy_edge.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/internal/terraform/graph_builder_apply.go b/internal/terraform/graph_builder_apply.go index 22f1b8c3bc..29e60ff6a0 100644 --- a/internal/terraform/graph_builder_apply.go +++ b/internal/terraform/graph_builder_apply.go @@ -144,7 +144,8 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer { // Destruction ordering &DestroyEdgeTransformer{ - Changes: b.Changes, + Changes: b.Changes, + Operation: b.Operation, }, &CBDEdgeTransformer{ Config: b.Config, diff --git a/internal/terraform/transform_destroy_edge.go b/internal/terraform/transform_destroy_edge.go index aac39fd4d7..3f87e7edf3 100644 --- a/internal/terraform/transform_destroy_edge.go +++ b/internal/terraform/transform_destroy_edge.go @@ -46,6 +46,11 @@ type DestroyEdgeTransformer struct { // DiffTransformer which was intended to be the only transformer operating // from the change set. Changes *plans.Changes + + // FIXME: Operation will not be needed here one we can better track + // inter-provider dependencies and remove the cycle checks in + // tryInterProviderDestroyEdge. + Operation walkOperation } // tryInterProviderDestroyEdge checks if we're inserting a destroy edge @@ -81,6 +86,12 @@ func (t *DestroyEdgeTransformer) tryInterProviderDestroyEdge(g *Graph, from, to e := dag.BasicEdge(from, to) g.Connect(e) + // If this is a complete destroy operation, then there are no create/update + // nodes to worry about and we can accept the edge without deeper inspection. + if t.Operation == walkDestroy { + return + } + // getComparableProvider inspects the node to try and get the most precise // description of the provider being used to help determine if 2 nodes are // from the same provider instance.