diff --git a/provisioner/terraform/provision.go b/provisioner/terraform/provision.go index e528abaaf44ea..d4cb3d2eb46f4 100644 --- a/provisioner/terraform/provision.go +++ b/provisioner/terraform/provision.go @@ -12,6 +12,8 @@ import ( "github.com/hashicorp/terraform-exec/tfexec" "golang.org/x/xerrors" + "cdr.dev/slog" + "github.com/coder/coder/provisionersdk/proto" ) @@ -149,6 +151,7 @@ func (t *terraform) Provision(request *proto.Provision_Request, stream proto.DRP resources := make([]*proto.Resource, 0) if state.Values != nil { for _, resource := range state.Values.RootModule.Resources { + t.logger.Debug(ctx, "appending state file", slog.F("name", resource.Name), slog.F("type", resource.Type)) resources = append(resources, &proto.Resource{ Name: resource.Name, Type: resource.Type, @@ -156,6 +159,7 @@ func (t *terraform) Provision(request *proto.Provision_Request, stream proto.DRP } } + t.logger.Debug(ctx, "sending completion response") return stream.Send(&proto.Provision_Response{ Type: &proto.Provision_Response_Complete{ Complete: &proto.Provision_Complete{ diff --git a/provisionerd/provisionerd.go b/provisionerd/provisionerd.go index 051515304776f..4153fcfb4be5e 100644 --- a/provisionerd/provisionerd.go +++ b/provisionerd/provisionerd.go @@ -52,7 +52,6 @@ func New(clientDialer Dialer, opts *Options) io.Closer { daemon := &provisionerDaemon{ clientDialer: clientDialer, opts: opts, - closeContext: ctx, closeCancel: ctxCancel, closed: make(chan struct{}), @@ -90,7 +89,7 @@ type provisionerDaemon struct { acquiredJobCancel context.CancelFunc acquiredJobCancelled atomic.Bool acquiredJobRunning atomic.Bool - acquiredJobDone chan struct{} + acquiredJobGroup sync.WaitGroup } // Connect establishes a connection to coderd. @@ -156,6 +155,9 @@ func (p *provisionerDaemon) connect(ctx context.Context) { // Locks a job in the database, and runs it! func (p *provisionerDaemon) acquireJob(ctx context.Context) { + if p.isClosed() { + return + } p.acquiredJobMutex.Lock() defer p.acquiredJobMutex.Unlock() if p.isRunningJob() { @@ -174,23 +176,22 @@ func (p *provisionerDaemon) acquireJob(ctx context.Context) { p.opts.Logger.Warn(context.Background(), "acquire job", slog.Error(err)) return } - if p.isClosed() { - return - } if p.acquiredJob.JobId == "" { p.opts.Logger.Debug(context.Background(), "no jobs available") return } ctx, p.acquiredJobCancel = context.WithCancel(ctx) + p.acquiredJobGroup.Add(1) p.acquiredJobCancelled.Store(false) p.acquiredJobRunning.Store(true) - p.acquiredJobDone = make(chan struct{}) p.opts.Logger.Info(context.Background(), "acquired job", + slog.F("job_id", p.acquiredJob.JobId), slog.F("organization_name", p.acquiredJob.OrganizationName), slog.F("project_name", p.acquiredJob.ProjectName), slog.F("username", p.acquiredJob.UserName), slog.F("provisioner", p.acquiredJob.Provisioner), + slog.F("job_type", p.acquiredJob.Type), ) go p.runJob(ctx) @@ -232,10 +233,8 @@ func (p *provisionerDaemon) runJob(ctx context.Context) { return } p.opts.Logger.Debug(ctx, "cleaned up work directory") - p.acquiredJobMutex.Lock() - defer p.acquiredJobMutex.Unlock() p.acquiredJobRunning.Store(false) - close(p.acquiredJobDone) + p.acquiredJobGroup.Done() }() // It's safe to cast this ProvisionerType. This data is coming directly from coderd. provisioner, hasProvisioner := p.opts.Provisioners[p.acquiredJob.Provisioner] @@ -328,7 +327,7 @@ func (p *provisionerDaemon) runJob(ctx context.Context) { } p.acquiredJobCancel() - p.opts.Logger.Info(context.Background(), "completed job") + p.opts.Logger.Info(context.Background(), "completed job", slog.F("job_id", p.acquiredJob.JobId)) } func (p *provisionerDaemon) runProjectImport(ctx context.Context, provisioner sdkproto.DRPCProvisionerClient, job *proto.AcquiredJob_ProjectImport_) { @@ -508,6 +507,7 @@ func (p *provisionerDaemon) Close() error { func (p *provisionerDaemon) closeWithError(err error) error { p.closeMutex.Lock() defer p.closeMutex.Unlock() + if p.isClosed() { return p.closeError } @@ -520,7 +520,7 @@ func (p *provisionerDaemon) closeWithError(err error) error { if !p.acquiredJobCancelled.Load() { p.cancelActiveJob(errMsg) } - <-p.acquiredJobDone + p.acquiredJobGroup.Wait() } p.opts.Logger.Debug(context.Background(), "closing server with error", slog.Error(err))