Skip to content

Commit

Permalink
Merge pull request #1454 from hashicorp/b-blocking-stats
Browse files Browse the repository at this point in the history
Driver Kill() does not block Stats()
  • Loading branch information
dadgar committed Jul 23, 2016
2 parents 432277a + 6da0515 commit b5b2faf
Showing 1 changed file with 21 additions and 19 deletions.
40 changes: 21 additions & 19 deletions client/alloc_runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,9 @@ func (r *AllocRunner) SaveState() error {
}

// Save state for each task
r.taskLock.RLock()
defer r.taskLock.RUnlock()
runners := r.getTaskRunners()
var mErr multierror.Error
for _, tr := range r.tasks {
for _, tr := range runners {
if err := r.saveTaskRunnerState(tr); err != nil {
mErr.Errors = append(mErr.Errors, err)
}
Expand Down Expand Up @@ -431,29 +430,25 @@ OUTER:
}

// Update the task groups
r.taskLock.RLock()
for _, task := range tg.Tasks {
tr := r.tasks[task.Name]
runners := r.getTaskRunners()
for _, tr := range runners {
tr.Update(update)
}
r.taskLock.RUnlock()

case <-r.destroyCh:
break OUTER
}
}

// Destroy each sub-task
r.taskLock.Lock()
for _, tr := range r.tasks {
runners := r.getTaskRunners()
for _, tr := range runners {
tr.Destroy()
}

// Wait for termination of the task runners
for _, tr := range r.tasks {
for _, tr := range runners {
<-tr.WaitCh()
}
r.taskLock.Unlock()

// Final state sync
r.syncStatus()
Expand Down Expand Up @@ -494,6 +489,19 @@ func (r *AllocRunner) StatsReporter() AllocStatsReporter {
return r
}

// getTaskRunners is a helper that returns a copy of the task runners list using
// the taskLock.
func (r *AllocRunner) getTaskRunners() []*TaskRunner {
// Get the task runners
r.taskLock.RLock()
defer r.taskLock.RUnlock()
runners := make([]*TaskRunner, 0, len(r.tasks))
for _, tr := range r.tasks {
runners = append(runners, tr)
}
return runners
}

// LatestAllocStats returns the latest allocation stats. If the optional taskFilter is set
// the allocation stats will only include the given task.
func (r *AllocRunner) LatestAllocStats(taskFilter string) (*cstructs.AllocResourceUsage, error) {
Expand All @@ -517,13 +525,7 @@ func (r *AllocRunner) LatestAllocStats(taskFilter string) (*cstructs.AllocResour
}
} else {
// Get the task runners
r.taskLock.RLock()
runners := make([]*TaskRunner, 0, len(r.tasks))
for _, tr := range r.tasks {
runners = append(runners, tr)
}
r.taskLock.RUnlock()

runners := r.getTaskRunners()
for _, tr := range runners {
l := tr.LatestResourceUsage()
if l != nil {
Expand Down

0 comments on commit b5b2faf

Please sign in to comment.