diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2020-07-07 16:22:22 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2020-07-07 16:22:22 +0200 |
commit | f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3 (patch) | |
tree | 439d6787fbe134bb343d201ac34715058749a60f /libpod/events.go | |
parent | 1a93857acc4ee1e5a9213e2c22f12802d84cd277 (diff) | |
download | podman-f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3.tar.gz podman-f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3.tar.bz2 podman-f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3.zip |
fix race condition in `libpod.GetEvents(...)`
Fix a race that could cause read errors to be masked. Masking such
errors is likely to report red herrings since users don't see that
reading failed for some reasons but that a given event could not be
found.
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'libpod/events.go')
-rw-r--r-- | libpod/events.go | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/libpod/events.go b/libpod/events.go index 7560940a5..3cbde8c5e 100644 --- a/libpod/events.go +++ b/libpod/events.go @@ -3,6 +3,7 @@ package libpod import ( "context" "fmt" + "sync" "github.com/containers/libpod/v2/libpod/events" "github.com/pkg/errors" @@ -86,7 +87,6 @@ func (r *Runtime) Events(ctx context.Context, options events.ReadOptions) error // GetEvents reads the event log and returns events based on input filters func (r *Runtime) GetEvents(ctx context.Context, filters []string) ([]*events.Event, error) { - var readErr error eventChannel := make(chan *events.Event) options := events.ReadOptions{ EventChannel: eventChannel, @@ -98,17 +98,20 @@ func (r *Runtime) GetEvents(ctx context.Context, filters []string) ([]*events.Ev if err != nil { return nil, err } + + logEvents := make([]*events.Event, 0, len(eventChannel)) + readLock := sync.Mutex{} + readLock.Lock() go func() { - readErr = eventer.Read(ctx, options) + for e := range eventChannel { + logEvents = append(logEvents, e) + } + readLock.Unlock() }() - if readErr != nil { - return nil, readErr - } - logEvents := make([]*events.Event, 0, len(eventChannel)) - for e := range eventChannel { - logEvents = append(logEvents, e) - } - return logEvents, nil + + readErr := eventer.Read(ctx, options) + readLock.Lock() // Wait for the events to be consumed. + return logEvents, readErr } // GetLastContainerEvent takes a container name or ID and an event status and returns |