insert panic handlers
This commit is contained in:
parent
3f31533f86
commit
d03a037567
|
@ -14,6 +14,7 @@ import (
|
|||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/command/views"
|
||||
"github.com/hashicorp/terraform/internal/configs/configschema"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/states/statemgr"
|
||||
"github.com/hashicorp/terraform/internal/terraform"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
|
@ -313,6 +314,7 @@ func (b *Local) Operation(ctx context.Context, op *backend.Operation) (*backend.
|
|||
|
||||
// Do it
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
defer done()
|
||||
defer stop()
|
||||
defer cancel()
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/command/views"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/plans"
|
||||
"github.com/hashicorp/terraform/internal/states"
|
||||
"github.com/hashicorp/terraform/internal/states/statefile"
|
||||
|
@ -156,6 +157,7 @@ func (b *Local) opApply(
|
|||
var applyDiags tfdiags.Diagnostics
|
||||
doneCh := make(chan struct{})
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
defer close(doneCh)
|
||||
log.Printf("[INFO] backend/local: apply calling Apply")
|
||||
applyState, applyDiags = lr.Core.Apply(plan, lr.Config)
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"log"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/plans"
|
||||
"github.com/hashicorp/terraform/internal/plans/planfile"
|
||||
"github.com/hashicorp/terraform/internal/states/statefile"
|
||||
|
@ -79,6 +80,7 @@ func (b *Local) opPlan(
|
|||
var planDiags tfdiags.Diagnostics
|
||||
doneCh := make(chan struct{})
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
defer close(doneCh)
|
||||
log.Printf("[INFO] backend/local: plan calling Plan")
|
||||
plan, planDiags = lr.Core.Plan(lr.Config, lr.InputState, lr.PlanOpts)
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/states"
|
||||
"github.com/hashicorp/terraform/internal/states/statemgr"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
|
@ -77,6 +78,7 @@ func (b *Local) opRefresh(
|
|||
var refreshDiags tfdiags.Diagnostics
|
||||
doneCh := make(chan struct{})
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
defer close(doneCh)
|
||||
newState, refreshDiags = lr.Core.Refresh(lr.Config, lr.InputState, lr.PlanOpts)
|
||||
log.Printf("[INFO] backend/local: refresh calling Refresh")
|
||||
|
|
|
@ -18,6 +18,7 @@ import (
|
|||
"github.com/hashicorp/terraform-svchost/disco"
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/configs/configschema"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/states/remote"
|
||||
"github.com/hashicorp/terraform/internal/states/statemgr"
|
||||
"github.com/hashicorp/terraform/internal/terraform"
|
||||
|
@ -755,6 +756,7 @@ func (b *Remote) Operation(ctx context.Context, op *backend.Operation) (*backend
|
|||
|
||||
// Do it.
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
defer done()
|
||||
defer stop()
|
||||
defer cancel()
|
||||
|
|
|
@ -13,6 +13,7 @@ import (
|
|||
|
||||
tfe "github.com/hashicorp/go-tfe"
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/plans"
|
||||
"github.com/hashicorp/terraform/internal/terraform"
|
||||
)
|
||||
|
@ -464,6 +465,8 @@ func (b *Remote) confirm(stopCtx context.Context, op *backend.Operation, opts *t
|
|||
result := make(chan error, 2)
|
||||
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
|
||||
// Make sure we cancel doneCtx before we return
|
||||
// so the input command is also canceled.
|
||||
defer cancel()
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
tfe "github.com/hashicorp/go-tfe"
|
||||
version "github.com/hashicorp/go-version"
|
||||
"github.com/hashicorp/terraform/internal/backend"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/plans"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
)
|
||||
|
@ -319,6 +320,8 @@ in order to capture the filesystem context the remote workspace expects:
|
|||
// cancellable after that period, we attempt to cancel it.
|
||||
if lockTimeout := op.StateLocker.Timeout(); lockTimeout > 0 {
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
|
||||
select {
|
||||
case <-stopCtx.Done():
|
||||
return
|
||||
|
|
|
@ -22,6 +22,7 @@ import (
|
|||
"github.com/hashicorp/terraform-svchost/disco"
|
||||
"github.com/hashicorp/terraform/internal/command/cliconfig"
|
||||
"github.com/hashicorp/terraform/internal/httpclient"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/terraform"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
|
||||
|
@ -450,6 +451,7 @@ func (c *LoginCommand) interactiveGetTokenByCode(hostname svchost.Hostname, cred
|
|||
}),
|
||||
}
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
err := server.Serve(listener)
|
||||
if err != nil && err != http.ErrServerClosed {
|
||||
diags = diags.Append(tfdiags.Sourceless(
|
||||
|
|
|
@ -12,7 +12,6 @@ import (
|
|||
|
||||
// This output is shown if a panic happens.
|
||||
const panicOutput = `
|
||||
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!! TERRAFORM CRASH !!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
Terraform crashed! This is always indicative of a bug within Terraform.
|
||||
|
@ -24,11 +23,11 @@ shown below, and any additional information which may help replicate the issue.
|
|||
[1]: https://github.com/hashicorp/terraform/issues
|
||||
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!! TERRAFORM CRASH !!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
`
|
||||
|
||||
// PanicHandler is called to recover from an internal panic in Terraform, and
|
||||
// is intended to replace the standard stack trace with a more user friendly
|
||||
// error message.
|
||||
// augments the standard stack trace with a more user friendly error message.
|
||||
// PanicHandler must be called as a defered function.
|
||||
func PanicHandler() {
|
||||
recovered := recover()
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
|
||||
"github.com/hashicorp/terraform/internal/addrs"
|
||||
"github.com/hashicorp/terraform/internal/configs"
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/providers"
|
||||
"github.com/hashicorp/terraform/internal/provisioners"
|
||||
"github.com/hashicorp/terraform/internal/states"
|
||||
|
@ -264,6 +265,8 @@ func (c *Context) watchStop(walker *ContextGraphWalker) (chan struct{}, <-chan s
|
|||
done := c.runContext.Done()
|
||||
|
||||
go func() {
|
||||
defer logging.PanicHandler()
|
||||
|
||||
defer close(wait)
|
||||
// Wait for a stop or completion
|
||||
select {
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/logging"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/addrs"
|
||||
|
@ -39,6 +40,10 @@ func (g *Graph) walk(walker GraphWalker) tfdiags.Diagnostics {
|
|||
|
||||
// Walk the graph.
|
||||
walkFn := func(v dag.Vertex) (diags tfdiags.Diagnostics) {
|
||||
// the walkFn is called asynchronously, and needs to be recovered
|
||||
// separately in the case of a panic.
|
||||
defer logging.PanicHandler()
|
||||
|
||||
log.Printf("[TRACE] vertex %q: starting visit (%T)", dag.VertexName(v), v)
|
||||
|
||||
defer func() {
|
||||
|
|
Loading…
Reference in New Issue