summaryrefslogtreecommitdiff
path: root/cmd/podman/utils.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2018-10-11 10:55:18 -0700
committerGitHub <noreply@github.com>2018-10-11 10:55:18 -0700
commit83327e6973c118e9c36a9393496981894f8908a0 (patch)
tree2b2426eea83d662ba514c2235b92b1884b13bca2 /cmd/podman/utils.go
parent6983e00a2808b29481d1cb460aab2eea1db6ef73 (diff)
parent9be18c2eaf0fbd9f868ecab54fd5029881e132f9 (diff)
downloadpodman-83327e6973c118e9c36a9393496981894f8908a0.tar.gz
podman-83327e6973c118e9c36a9393496981894f8908a0.tar.bz2
podman-83327e6973c118e9c36a9393496981894f8908a0.zip
Merge pull request #1614 from baude/parastop
Stop containers in parallel fashion
Diffstat (limited to 'cmd/podman/utils.go')
-rw-r--r--cmd/podman/utils.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go
index 89ec48dbe..1b767532e 100644
--- a/cmd/podman/utils.go
+++ b/cmd/podman/utils.go
@@ -5,6 +5,7 @@ import (
"fmt"
"os"
gosignal "os/signal"
+ "sync"
"github.com/containers/libpod/libpod"
"github.com/docker/docker/pkg/signal"
@@ -215,3 +216,50 @@ func getPodsFromContext(c *cli.Context, r *libpod.Runtime) ([]*libpod.Pod, error
}
return pods, lastError
}
+
+type pFunc func() error
+
+type workerInput struct {
+ containerID string
+ parallelFunc pFunc
+}
+
+// worker is a "threaded" worker that takes jobs from the channel "queue"
+func worker(wg *sync.WaitGroup, jobs <-chan workerInput, results map[string]error) {
+ for j := range jobs {
+ err := j.parallelFunc()
+ results[j.containerID] = err
+ wg.Done()
+ }
+}
+
+// parallelExecuteWorkerPool takes container jobs and performs them in parallel. The worker
+// int is determines how many workers/threads should be premade.
+func parallelExecuteWorkerPool(workers int, functions []workerInput) map[string]error {
+ var (
+ wg sync.WaitGroup
+ )
+ results := make(map[string]error)
+ paraJobs := make(chan workerInput, len(functions))
+
+ // If we have more workers than functions, match up the number of workers and functions
+ if workers > len(functions) {
+ workers = len(functions)
+ }
+
+ // Create the workers
+ for w := 1; w <= workers; w++ {
+ go worker(&wg, paraJobs, results)
+ }
+
+ // Add jobs to the workers
+ for _, j := range functions {
+ j := j
+ wg.Add(1)
+ paraJobs <- j
+ }
+
+ close(paraJobs)
+ wg.Wait()
+ return results
+}