From c5bdb6afe741d34c32f779b6ef9508b6f1d05794 Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Fri, 9 Sep 2022 11:07:07 +0200 Subject: fix hang with podman events file logger podman --events-backend file events --stream=false should never hang. The problem is that our tail library will wait for the file to be created which makes sense when we do not run with --stream=false. To fix this we can just always create the file when the logger is initialized. This would also help to report errors early on in case the file is not accessible. Fixes part one from #15688 Signed-off-by: Paul Holzinger --- test/system/090-events.bats | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'test/system') diff --git a/test/system/090-events.bats b/test/system/090-events.bats index cd1bf327b..51a327865 100644 --- a/test/system/090-events.bats +++ b/test/system/090-events.bats @@ -147,7 +147,6 @@ function _populate_events_file() { # Config without a limit eventsFile=$PODMAN_TMPDIR/events.txt - _populate_events_file $eventsFile containersConf=$PODMAN_TMPDIR/containers.conf cat >$containersConf < Date: Fri, 9 Sep 2022 11:43:20 +0200 Subject: event backend none: return an error when reading events podman --events-backend none events should return with an error since it will never be able to actually list events. Fixes part three of #15688 Signed-off-by: Paul Holzinger --- cmd/podman/system/events.go | 39 +++++++++++++++++++++------------------ libpod/events/events_linux.go | 2 +- libpod/events/nullout.go | 13 +++++++------ test/system/090-events.bats | 9 +++++++++ 4 files changed, 38 insertions(+), 25 deletions(-) (limited to 'test/system') diff --git a/cmd/podman/system/events.go b/cmd/podman/system/events.go index 3c6a35e83..57279bb02 100644 --- a/cmd/podman/system/events.go +++ b/cmd/podman/system/events.go @@ -99,25 +99,28 @@ func eventsCmd(cmd *cobra.Command, _ []string) error { errChannel <- err }() - for event := range eventChannel { - switch { - case event == nil: - // no-op - case doJSON: - jsonStr, err := event.ToJSONString() - if err != nil { - return err + for { + select { + case err := <-errChannel: + return err + case event := <-eventChannel: + switch { + case event == nil: + // no-op + case doJSON: + jsonStr, err := event.ToJSONString() + if err != nil { + return err + } + fmt.Println(jsonStr) + case cmd.Flags().Changed("format"): + if err := rpt.Execute(event); err != nil { + return err + } + os.Stdout.WriteString("\n") + default: + fmt.Println(event.ToHumanReadable(!noTrunc)) } - fmt.Println(jsonStr) - case cmd.Flags().Changed("format"): - if err := rpt.Execute(event); err != nil { - return err - } - os.Stdout.WriteString("\n") - default: - fmt.Println(event.ToHumanReadable(!noTrunc)) } } - - return <-errChannel } diff --git a/libpod/events/events_linux.go b/libpod/events/events_linux.go index b11467aca..66b125dd5 100644 --- a/libpod/events/events_linux.go +++ b/libpod/events/events_linux.go @@ -20,7 +20,7 @@ func NewEventer(options EventerOptions) (Eventer, error) { case strings.ToUpper(LogFile.String()): return newLogFileEventer(options) case strings.ToUpper(Null.String()): - return NewNullEventer(), nil + return newNullEventer(), nil case strings.ToUpper(Memory.String()): return NewMemoryEventer(), nil default: diff --git a/libpod/events/nullout.go b/libpod/events/nullout.go index 587a1b98b..da3820c23 100644 --- a/libpod/events/nullout.go +++ b/libpod/events/nullout.go @@ -2,10 +2,11 @@ package events import ( "context" + "errors" ) -// EventToNull is an eventer type that only performs write operations -// and only writes to /dev/null. It is meant for unittests only +// EventToNull is an eventer type that does nothing. +// It is meant for unittests only type EventToNull struct{} // Write eats the event and always returns nil @@ -13,14 +14,14 @@ func (e EventToNull) Write(ee Event) error { return nil } -// Read does nothing. Do not use it. +// Read does nothing and returns an error. func (e EventToNull) Read(ctx context.Context, options ReadOptions) error { - return nil + return errors.New("cannot read events with the \"none\" backend") } -// NewNullEventer returns a new null eventer. You should only do this for +// newNullEventer returns a new null eventer. You should only do this for // the purposes of internal libpod testing. -func NewNullEventer() Eventer { +func newNullEventer() Eventer { return EventToNull{} } diff --git a/test/system/090-events.bats b/test/system/090-events.bats index 51a327865..509e7a306 100644 --- a/test/system/090-events.bats +++ b/test/system/090-events.bats @@ -217,3 +217,12 @@ EOF --format="{{.Attributes.$lname}}" assert "$output" = "$lvalue" "podman-events output includes container label" } + +@test "events - backend none should error" { + skip_if_remote "remote does not support --events-backend" + + run_podman 125 --events-backend none events + is "$output" "Error: cannot read events with the \"none\" backend" "correct error message" + run_podman 125 --events-backend none events --stream=false + is "$output" "Error: cannot read events with the \"none\" backend" "correct error message" +} -- cgit v1.2.3-54-g00ecf From 2ae4ce79996097fb0a403abbb9be9ef7b5c02d80 Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Mon, 12 Sep 2022 14:22:27 +0200 Subject: fix race where podman events exits to early In order to display all events we have to read until the event channel is closed. Signed-off-by: Paul Holzinger --- cmd/podman/system/events.go | 16 +++++++++++----- test/system/090-events.bats | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'test/system') diff --git a/cmd/podman/system/events.go b/cmd/podman/system/events.go index 57279bb02..693af3e60 100644 --- a/cmd/podman/system/events.go +++ b/cmd/podman/system/events.go @@ -101,12 +101,12 @@ func eventsCmd(cmd *cobra.Command, _ []string) error { for { select { - case err := <-errChannel: - return err - case event := <-eventChannel: + case event, ok := <-eventChannel: + if !ok { + // channel was closed we can exit + return nil + } switch { - case event == nil: - // no-op case doJSON: jsonStr, err := event.ToJSONString() if err != nil { @@ -121,6 +121,12 @@ func eventsCmd(cmd *cobra.Command, _ []string) error { default: fmt.Println(event.ToHumanReadable(!noTrunc)) } + case err := <-errChannel: + // only exit in case of an error, + // otherwise keep reading events until the event channel is closed + if err != nil { + return err + } } } } diff --git a/test/system/090-events.bats b/test/system/090-events.bats index 509e7a306..3fac51938 100644 --- a/test/system/090-events.bats +++ b/test/system/090-events.bats @@ -74,6 +74,7 @@ load helpers .*image tag $imageID $tag .*image untag $imageID $tag:latest .*image tag $imageID $tag +.*image untag $imageID $IMAGE .*image untag $imageID $tag:latest .*image remove $imageID $imageID" \ "podman events" -- cgit v1.2.3-54-g00ecf