Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd9ed06d

Browse files
committed
Fix data race in provisioner p.acquiredJobDone chan
1 parent6c28118 commitd9ed06d

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

‎provisionerd/provisionerd.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ func (p *provisionerDaemon) connect(ctx context.Context) {
156156

157157
// Locks a job in the database, and runs it!
158158
func (p*provisionerDaemon)acquireJob(ctx context.Context) {
159+
ifp.isClosed() {
160+
return
161+
}
159162
p.acquiredJobMutex.Lock()
160163
deferp.acquiredJobMutex.Unlock()
161164
ifp.isRunningJob() {
@@ -174,16 +177,14 @@ func (p *provisionerDaemon) acquireJob(ctx context.Context) {
174177
p.opts.Logger.Warn(context.Background(),"acquire job",slog.Error(err))
175178
return
176179
}
177-
ifp.isClosed() {
178-
return
179-
}
180180
ifp.acquiredJob.JobId=="" {
181181
p.opts.Logger.Debug(context.Background(),"no jobs available")
182182
return
183183
}
184184
ctx,p.acquiredJobCancel=context.WithCancel(ctx)
185185
p.acquiredJobCancelled.Store(false)
186186
p.acquiredJobRunning.Store(true)
187+
187188
p.acquiredJobDone=make(chanstruct{})
188189

189190
p.opts.Logger.Info(context.Background(),"acquired job",
@@ -234,8 +235,6 @@ func (p *provisionerDaemon) runJob(ctx context.Context) {
234235
return
235236
}
236237
p.opts.Logger.Debug(ctx,"cleaned up work directory")
237-
p.acquiredJobMutex.Lock()
238-
deferp.acquiredJobMutex.Unlock()
239238
p.acquiredJobRunning.Store(false)
240239
close(p.acquiredJobDone)
241240
}()
@@ -510,11 +509,22 @@ func (p *provisionerDaemon) Close() error {
510509
func (p*provisionerDaemon)closeWithError(errerror)error {
511510
p.closeMutex.Lock()
512511
deferp.closeMutex.Unlock()
512+
513513
ifp.isClosed() {
514514
returnp.closeError
515515
}
516516

517517
ifp.isRunningJob() {
518+
519+
// We also need the 'acquire job' mutex here,
520+
// so that a new `p.acquiredJobDone` channel isn't created
521+
// while we're waiting on the mutex.
522+
523+
// Note the mutex order - it's important that we always use the same order of acquisition
524+
// to avoid deadlocks
525+
p.acquiredJobMutex.Lock()
526+
deferp.acquiredJobMutex.Unlock()
527+
518528
errMsg:="provisioner daemon was shutdown gracefully"
519529
iferr!=nil {
520530
errMsg=err.Error()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp