diff options
author | Valentin Rothberg <vrothberg@redhat.com> | 2022-09-15 14:15:15 +0200 |
---|---|---|
committer | Valentin Rothberg <vrothberg@redhat.com> | 2022-09-16 13:43:23 +0200 |
commit | 1071098ee24f2764946c72065b3e422eddc47666 (patch) | |
tree | 99af153afebfe1b1e67d2b7f403a6ea3c5a8d3f1 /pkg/domain/infra/abi/play.go | |
parent | 740223c441e5e6958ebd203c676e226263e5285d (diff) | |
download | podman-1071098ee24f2764946c72065b3e422eddc47666.tar.gz podman-1071098ee24f2764946c72065b3e422eddc47666.tar.bz2 podman-1071098ee24f2764946c72065b3e422eddc47666.zip |
kube play: sdnotify proxy: use a wait group
Use a wait group to a) wait for all proxies in parallel
b) avoid the potential for ABBA deadlocks
[NO NEW TESTS NEEDED] as it is not changing functionality
Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
Diffstat (limited to 'pkg/domain/infra/abi/play.go')
-rw-r--r-- | pkg/domain/infra/abi/play.go | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/pkg/domain/infra/abi/play.go b/pkg/domain/infra/abi/play.go index d447b4d00..a65403fb4 100644 --- a/pkg/domain/infra/abi/play.go +++ b/pkg/domain/infra/abi/play.go @@ -11,6 +11,7 @@ import ( "path/filepath" "strconv" "strings" + "sync" buildahDefine "github.com/containers/buildah/define" "github.com/containers/common/libimage" @@ -699,9 +700,24 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY fmt.Println(playKubePod.ContainerErrors) } - // Wait for each proxy to receive a READY message. - for _, proxy := range sdNotifyProxies { - if err := proxy.WaitAndClose(); err != nil { + // Wait for each proxy to receive a READY message. Use a wait + // group to prevent the potential for ABBA kinds of deadlocks. + var wg sync.WaitGroup + errors := make([]error, len(sdNotifyProxies)) + for i := range sdNotifyProxies { + wg.Add(1) + go func(i int) { + err := sdNotifyProxies[i].WaitAndClose() + if err != nil { + err = fmt.Errorf("waiting for sd-notify proxy: %w", err) + } + errors[i] = err + wg.Done() + }(i) + } + wg.Wait() + for _, err := range errors { + if err != nil { return nil, err } } |