diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-07-07 18:06:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-07 18:06:31 +0200 |
commit | cd084853b6187d8b236ea327818277cc02e0b916 (patch) | |
tree | 0ad651a987b7b358c1911d7a3a633fe4d2335b30 /libpod | |
parent | 8014008703eef712f83e943e3d5772e6eb735bab (diff) | |
parent | f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3 (diff) | |
download | podman-cd084853b6187d8b236ea327818277cc02e0b916.tar.gz podman-cd084853b6187d8b236ea327818277cc02e0b916.tar.bz2 podman-cd084853b6187d8b236ea327818277cc02e0b916.zip |
Merge pull request #6881 from vrothberg/events-race
fix race condition in `libpod.GetEvents(...)`
Diffstat (limited to 'libpod')
-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 |