opentofu/internal/terraform
Martin Atkins f0de9b60c1 backend/local: Periodically persist intermediate state snapshots
Terraform Core emits a hook event every time it writes a change into the
in-memory state. Previously the local backend would just copy that into
the transient storage of the state manager, but for most state storage
implementations that doesn't really do anything useful because it just
makes another copy of the state in memory.

We originally added this hook mechanism with the intent of making
Terraform _persist_ the state each time, but we backed that out after
finding that it was a bit too aggressive and was making the state snapshot
history much harder to use in storage systems that can preserve historical
snapshots.

However, sometimes Terraform gets killed mid-apply for whatever reason and
in our previous implementation that meant always losing that transient
state, forcing the user to edit the state manually (or use "import") to
recover a useful state.

In an attempt at finding a sweet spot between these extremes, here we
change the rule so that if an apply runs for longer than 20 seconds then
we'll try to persist the state to the backend in an update that arrives
at least 20 seconds after the first update, and then again for each
additional 20 second period as long as Terraform keeps announcing new
state snapshots.

This also introduces a special interruption mode where if the apply phase
gets interrupted by SIGINT (or equivalent) then the local backend will
try to persist the state immediately in anticipation of a
possibly-imminent SIGKILL, and will then immediately persist any
subsequent state update that arrives until the apply phase is complete.
After interruption Terraform will not start any new operations and will
instead just let any already-running operations run to completion, and so
this will persist the state once per resource instance that is able to
complete before being killed.

This does mean that now long-running applies will generate intermediate
state snapshots where they wouldn't before, but there should still be
considerably fewer snapshots than were created when we were persisting
for each individual state change. We can adjust the 20 second interval
in future commits if we find that this spot isn't as sweet as first
assumed.
2023-02-14 15:17:56 -08:00
..
testdata backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
context_apply2_test.go save null module outputs in state 2023-01-26 11:03:23 -05:00
context_apply_test.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
context_apply.go core: Mark errored plans as errored 2022-12-12 17:17:42 -05:00
context_eval_test.go check console with preconditions 2022-10-19 17:47:53 -04:00
context_eval.go core and backend: remove redundant handling of default variable values 2022-01-10 12:26:54 -08:00
context_fixtures_test.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_import_test.go unknown evaluation of missing instances in import 2022-10-04 11:07:16 -04:00
context_import.go RemovePlannedResourceInstanceObjects during import 2022-09-25 14:41:53 -04:00
context_input_test.go wrap multiple provider creations into a factory fn 2021-10-12 17:47:50 -04:00
context_input.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_plan2_test.go always report condition errors 2022-12-14 14:45:04 -05:00
context_plan_test.go special handling for legacy ignore_changes = all 2022-09-30 09:19:29 -04:00
context_plan.go core: Mark errored plans as errored 2022-12-12 17:17:42 -05:00
context_plugins_test.go build: Use Go 1.19 2022-08-22 10:59:12 -07:00
context_plugins.go core: Simplify and centralize plugin availability checks 2021-10-01 14:43:58 -07:00
context_refresh_test.go fix invalid null blocks during refresh 2022-12-21 10:18:26 -05:00
context_refresh.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_test.go fix test mocks to behave when planning destroys 2022-07-06 13:47:35 -04:00
context_validate_test.go don't lose warnings from static validation 2022-08-09 16:15:56 -04:00
context_validate.go Combine all plan graphs, including import 2022-06-20 15:40:49 -04:00
context_walk.go core: Propagate check results accurately from plan to apply 2022-08-26 15:47:29 -07:00
context.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
diagnostics.go tfdiags: Treat unknown-related or sensitive-related messages differently 2022-06-23 13:52:23 -07:00
eval_conditions.go always report condition errors 2022-12-14 14:45:04 -05:00
eval_context_builtin_test.go core: Replace contextComponentFactory with contextPlugins 2021-09-10 14:56:49 -07:00
eval_context_builtin.go core: Use the new checks package for condition tracking 2022-08-26 15:47:29 -07:00
eval_context_mock.go core: Use the new checks package for condition tracking 2022-08-26 15:47:29 -07:00
eval_context.go core: Use the new checks package for condition tracking 2022-08-26 15:47:29 -07:00
eval_count_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
eval_count.go tfdiags: Treat unknown-related or sensitive-related messages differently 2022-06-23 13:52:23 -07:00
eval_for_each_test.go tfdiags: Treat unknown-related or sensitive-related messages differently 2022-06-23 13:52:23 -07:00
eval_for_each.go tfdiags: Treat unknown-related or sensitive-related messages differently 2022-06-23 13:52:23 -07:00
eval_provider_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
eval_provider.go core: EvalContextBuiltin no longer has a "Schemas" 2021-09-10 14:56:49 -07:00
eval_variable_test.go Reverse the order of conversion/defaults, and update HCL with more flexible defaults package (#32454) 2023-01-31 06:37:24 -05:00
eval_variable.go Reverse the order of conversion/defaults, and update HCL with more flexible defaults package (#32454) 2023-01-31 06:37:24 -05:00
evaluate_test.go Merge pull request #29559 from hashicorp/jbardin/optional-attrs 2021-09-13 08:58:11 -04:00
evaluate_triggers_test.go evaluate replace_triggered_by expressions 2022-04-20 09:17:10 -04:00
evaluate_triggers.go evaluate replace_triggered_by expressions 2022-04-20 09:17:10 -04:00
evaluate_valid_test.go core: Graph walk loads plugin schemas opportunistically 2021-09-10 14:56:49 -07:00
evaluate_valid.go core: Document postconditions as valid use of self 2022-01-31 14:34:35 -05:00
evaluate.go typo (#32327) 2022-12-09 16:14:01 +00:00
execute.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
features.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_builder_apply_test.go core: refactoring.ImpliedMoveStatements replaces NodeCountBoundary 2021-09-20 09:06:22 -07:00
graph_builder_apply.go check walkDestroy to help DestroyEdgeTransformer 2022-11-17 13:29:09 -05:00
graph_builder_eval.go checks must be registered during eval 2022-10-19 17:47:53 -04:00
graph_builder_plan_test.go core: Use DynamicExpand even for root module outputs 2022-07-22 15:25:22 -07:00
graph_builder_plan.go evaluate outputs from state 2022-11-28 16:39:55 -05:00
graph_builder_test.go always validate all graphs 2022-03-11 10:20:50 -05:00
graph_builder.go always validate all graphs 2022-03-11 10:20:50 -05:00
graph_dot_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_dot.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_interface_subgraph.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_test.go de-linting 2021-09-01 11:36:21 -04:00
graph_walk_context.go core: Use the new checks package for condition tracking 2022-08-26 15:47:29 -07:00
graph_walk_operation.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_walk_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_walk.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph.go fix error message 2022-10-19 14:29:34 -04:00
hook_mock.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
hook_stop_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook_stop.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
hook_test.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
hook.go backend/local: Periodically persist intermediate state snapshots 2023-02-14 15:17:56 -08:00
instance_expanders.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
marks_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
marks.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_data_destroy_test.go command/workspace_delete: Allow deleting a workspace with empty husks 2021-10-13 13:54:11 -07:00
node_data_destroy.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_local_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_local.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
node_module_expand_test.go evaluate outputs from state 2022-11-28 16:39:55 -05:00
node_module_expand.go evaluate outputs from state 2022-11-28 16:39:55 -05:00
node_module_variable_test.go configs: add ConstraintType to config.Variable 2021-09-13 08:51:32 -04:00
node_module_variable.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
node_output_test.go core: Use the new checks package for condition tracking 2022-08-26 15:47:29 -07:00
node_output.go save null module outputs in state 2023-01-26 11:03:23 -05:00
node_provider_abstract.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_provider_eval.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_provider_test.go build: Use Go 1.19 2022-08-22 10:59:12 -07:00
node_provider.go configure providers during destroy plan 2022-06-01 16:03:27 -04:00
node_resource_abstract_instance_test.go ProvidedBy should return the resolved provider 2022-11-22 09:41:53 -05:00
node_resource_abstract_instance.go add resource address to log message 2022-12-21 10:53:11 -05:00
node_resource_abstract_test.go ProvidedBy should return the resolved provider 2022-11-22 09:41:53 -05:00
node_resource_abstract.go ProvidedBy should return the resolved provider 2022-11-22 09:41:53 -05:00
node_resource_apply_instance.go use key data from plan method for apply 2022-11-01 16:18:38 -04:00
node_resource_apply_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_apply.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
node_resource_destroy_deposed_test.go fixup tests for MockProvider changes 2021-10-08 08:42:06 -04:00
node_resource_destroy_deposed.go avoid re-writing state for noop applies 2022-11-01 16:18:38 -04:00
node_resource_destroy.go avoid re-writing state for noop applies 2022-11-01 16:18:38 -04:00
node_resource_import.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
node_resource_plan_destroy.go remove data sources from state read and upgrade 2022-04-11 11:55:53 -04:00
node_resource_plan_instance.go Make the pre-destroy refresh a full plan 2022-11-11 14:33:50 -05:00
node_resource_plan_orphan_test.go Fix panic when planning orphaned deposed instances 2023-02-10 15:31:21 -05:00
node_resource_plan_orphan.go Fix panic when planning orphaned deposed instances 2023-02-10 15:31:21 -05:00
node_resource_plan.go Make the pre-destroy refresh a full plan 2022-11-11 14:33:50 -05:00
node_resource_validate_test.go core: Refactor stub repetition data generation 2022-03-10 13:52:48 -05:00
node_resource_validate.go communicator/ssh: Add support SSH over HTTP Proxy (#30274) 2022-04-27 16:59:17 -04:00
node_root_variable_test.go core: Check rule error message expressions 2022-03-04 15:35:39 -05:00
node_root_variable.go core: More accurate error message for invalid variable values 2022-01-10 12:26:54 -08:00
node_value.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
phasestate_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
provider_mock.go fix test mocks to behave when planning destroys 2022-07-06 13:47:35 -04:00
provisioner_mock_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
provisioner_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
reduce_plan_test.go test for null map and fix lost map marks 2021-11-11 10:44:39 -05:00
reduce_plan.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
resource_provider_mock_test.go de-linting 2021-09-01 11:36:21 -04:00
schemas_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
schemas.go providers: A type for all schemas for a particular provider 2022-03-04 15:51:36 -05:00
terraform_test.go Experiments supported only in alpha/dev builds 2022-06-17 14:46:07 -07:00
transform_attach_config_provider_meta.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_config_provider.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_config_resource.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_schema.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_attach_state.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_config_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_config.go Combine all plan graphs, including import 2022-06-20 15:40:49 -04:00
transform_destroy_cbd_test.go make sure CBD test graphs are valid 2022-03-11 10:20:50 -05:00
transform_destroy_cbd.go build: Use Go 1.19 2022-08-22 10:59:12 -07:00
transform_destroy_edge_test.go ensure destroy edges from data sources 2022-11-11 14:56:09 -05:00
transform_destroy_edge.go check walkDestroy to help DestroyEdgeTransformer 2022-11-17 13:29:09 -05:00
transform_diff_test.go only add NoOp nodes with conditions 2022-11-01 16:18:38 -04:00
transform_diff.go only add NoOp nodes with conditions 2022-11-01 16:18:38 -04:00
transform_expand.go core: DynamicExpand can return diagnostics 2022-09-26 13:46:25 -07:00
transform_import_state_test.go fixup tests for MockProvider changes 2021-10-08 08:42:06 -04:00
transform_local.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_expansion.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_variable_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_variable.go remove synthetic default expression for variables 2022-01-10 16:22:33 -05:00
transform_orphan_count_test.go Do not add orphan nodes for deposed instances 2023-02-10 16:25:11 -05:00
transform_orphan_count.go Do not add orphan nodes for deposed instances 2023-02-10 16:25:11 -05:00
transform_orphan_output.go evaluate outputs from state 2022-11-28 16:39:55 -05:00
transform_orphan_resource_test.go deposed instances should not be counted as orphans 2021-05-20 09:36:45 -04:00
transform_orphan_resource.go Do not add orphan nodes for deposed instances 2023-02-10 16:25:11 -05:00
transform_output.go make naming consistent 2022-10-20 09:36:10 -04:00
transform_provider_test.go Merge pull request #31283 from hashicorp/jbardin/plan-import 2022-06-23 13:26:59 -04:00
transform_provider.go skip already added provider nodes 2022-06-10 10:37:58 -04:00
transform_provisioner.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_reference_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_reference.go fix log mesage 2022-11-01 16:18:38 -04:00
transform_removed_modules.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_resource_count.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_root_test.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
transform_root.go core: Simplify our idea of "root node" and require it for DynamicExpand 2022-10-13 14:01:08 -07:00
transform_state.go command/workspace_delete: Allow deleting a workspace with empty husks 2021-10-13 13:54:11 -07:00
transform_targets_test.go core: Use DynamicExpand even for root module outputs 2022-07-22 15:25:22 -07:00
transform_targets.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_transitive_reduction_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_transitive_reduction.go Update comment for this transformer 2022-03-22 17:17:56 -06:00
transform_variable.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
transform_vertex_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_vertex.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_prefix_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_prefix.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_callback_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_callback.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_mock_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_provisioner_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_provisioner.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
update_state_hook_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
update_state_hook.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
upgrade_resource_state_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
upgrade_resource_state.go remove data sources from state read and upgrade 2022-04-11 11:55:53 -04:00
util_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
util.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
validate_selfref_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
validate_selfref.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
valuesourcetype_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
variables_test.go core and backend: remove redundant handling of default variable values 2022-01-10 12:26:54 -08:00
variables.go core: More accurate error message for invalid variable values 2022-01-10 12:26:54 -08:00
version_required.go Fail global required_version check if it contains any prerelease fields (#31331) 2022-06-30 09:58:28 +01:00
walkoperation_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00