mirror of
https://github.com/containers/podman.git
synced 2025-06-23 10:38:20 +08:00
Swap from map to channels for podman stop workers
We were encountering sync issues with the map, so swap to a thread-safe channel and convert into a map when we output Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
This commit is contained in:
@ -224,11 +224,16 @@ type workerInput struct {
|
||||
parallelFunc pFunc
|
||||
}
|
||||
|
||||
type containerError struct {
|
||||
containerID string
|
||||
err error
|
||||
}
|
||||
|
||||
// worker is a "threaded" worker that takes jobs from the channel "queue"
|
||||
func worker(wg *sync.WaitGroup, jobs <-chan workerInput, results map[string]error) {
|
||||
func worker(wg *sync.WaitGroup, jobs <-chan workerInput, results chan<- containerError) {
|
||||
for j := range jobs {
|
||||
err := j.parallelFunc()
|
||||
results[j.containerID] = err
|
||||
results <- containerError{containerID: j.containerID, err: err}
|
||||
wg.Done()
|
||||
}
|
||||
}
|
||||
@ -239,6 +244,8 @@ func parallelExecuteWorkerPool(workers int, functions []workerInput) map[string]
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
)
|
||||
|
||||
resultChan := make(chan containerError, len(functions))
|
||||
results := make(map[string]error)
|
||||
paraJobs := make(chan workerInput, len(functions))
|
||||
|
||||
@ -249,7 +256,7 @@ func parallelExecuteWorkerPool(workers int, functions []workerInput) map[string]
|
||||
|
||||
// Create the workers
|
||||
for w := 1; w <= workers; w++ {
|
||||
go worker(&wg, paraJobs, results)
|
||||
go worker(&wg, paraJobs, resultChan)
|
||||
}
|
||||
|
||||
// Add jobs to the workers
|
||||
@ -261,5 +268,11 @@ func parallelExecuteWorkerPool(workers int, functions []workerInput) map[string]
|
||||
|
||||
close(paraJobs)
|
||||
wg.Wait()
|
||||
|
||||
close(resultChan)
|
||||
for ctrError := range resultChan {
|
||||
results[ctrError.containerID] = ctrError.err
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
Reference in New Issue
Block a user