diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-10-07 15:06:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-07 15:06:02 -0400 |
commit | 0e1d01103e45430693736dac10be13c49cf23f03 (patch) | |
tree | aed0f84e88d4e4de22b5e262761e95c951f4f610 /pkg/parallel/ctr/ctr.go | |
parent | 9ae873e60e149677db66782eaf2b4ed1402e97d2 (diff) | |
parent | 55f5e4af11a2428b14b36bbdcd4b1d91e868d786 (diff) | |
download | podman-0e1d01103e45430693736dac10be13c49cf23f03.tar.gz podman-0e1d01103e45430693736dac10be13c49cf23f03.tar.bz2 podman-0e1d01103e45430693736dac10be13c49cf23f03.zip |
Merge pull request #7382 from mheon/pod_parallel
Move pod jobs to parallel execution
Diffstat (limited to 'pkg/parallel/ctr/ctr.go')
-rw-r--r-- | pkg/parallel/ctr/ctr.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/pkg/parallel/ctr/ctr.go b/pkg/parallel/ctr/ctr.go new file mode 100644 index 000000000..e8c1292b8 --- /dev/null +++ b/pkg/parallel/ctr/ctr.go @@ -0,0 +1,40 @@ +package ctr + +import ( + "context" + + "github.com/containers/podman/v2/libpod" + "github.com/containers/podman/v2/pkg/parallel" + "github.com/sirupsen/logrus" +) + +// ContainerOp performs the given function on the given set of +// containers, using a number of parallel threads. +// If no error is returned, each container specified in ctrs will have an entry +// in the resulting map; containers with no error will be set to nil. +func ContainerOp(ctx context.Context, ctrs []*libpod.Container, applyFunc func(*libpod.Container) error) (map[*libpod.Container]error, error) { + // We could use a sync.Map but given Go's lack of generic I'd rather + // just use a lock on a normal map... + // The expectation is that most of the time is spent in applyFunc + // anyways. + var ( + errMap = make(map[*libpod.Container]<-chan error) + ) + + for _, ctr := range ctrs { + c := ctr + logrus.Debugf("Starting parallel job on container %s", c.ID()) + errChan := parallel.Enqueue(ctx, func() error { + return applyFunc(c) + }) + errMap[c] = errChan + } + + finalErr := make(map[*libpod.Container]error) + for ctr, errChan := range errMap { + err := <-errChan + finalErr[ctr] = err + } + + return finalErr, nil +} |