diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2020-07-07 16:22:22 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2020-07-07 17:29:14 +0200 |
commit | 0bc40bdcf3063fcc0b2db5b65b9c9f74ca08f0f1 (patch) | |
tree | c2ebe74182112f4f5c7df93ddab1646980c41cd0 | |
parent | ea7a6101ef14976c3400796509f7a30dc58baddc (diff) | |
download | podman-0bc40bdcf3063fcc0b2db5b65b9c9f74ca08f0f1.tar.gz podman-0bc40bdcf3063fcc0b2db5b65b9c9f74ca08f0f1.tar.bz2 podman-0bc40bdcf3063fcc0b2db5b65b9c9f74ca08f0f1.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.
Backport-of: commit f4a2d25c0fca
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
-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 |