container stats: fix --no-stream race

Fix a race in `podman container stats` by waiting for the client to
consume the data in the channel.  This requires a `sync.WaitGroup` (or
semaphore) in the client and to also close the channel the backend.

Fixes: #6405
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
Valentin Rothberg 2020-05-27 13:51:48 +02:00
parent 119e13d4bc
commit 3cef598fc2
2 changed files with 9 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import (
"fmt"
"os"
"strings"
"sync"
"text/tabwriter"
"text/template"
@ -111,14 +112,20 @@ func stats(cmd *cobra.Command, args []string) error {
}
}
statsOptions.StatChan = make(chan []*define.ContainerStats, 1)
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
for reports := range statsOptions.StatChan {
if err := outputStats(reports); err != nil {
logrus.Error(err)
}
}
wg.Done()
}()
return registry.ContainerEngine().ContainerStats(registry.Context(), args, statsOptions)
err := registry.ContainerEngine().ContainerStats(registry.Context(), args, statsOptions)
wg.Wait()
return err
}
func outputStats(reports []*define.ContainerStats) error {

View File

@ -1087,6 +1087,7 @@ func (ic *ContainerEngine) Shutdown(_ context.Context) {
}
func (ic *ContainerEngine) ContainerStats(ctx context.Context, namesOrIds []string, options entities.ContainerStatsOptions) error {
defer close(options.StatChan)
containerFunc := ic.Libpod.GetRunningContainers
switch {
case len(namesOrIds) > 0: