diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2021-06-21 14:31:26 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2021-06-21 15:44:13 +0200 |
commit | ee4cab0e096f41f00d84a55dc16b2dc2b9df05e9 (patch) | |
tree | 53848b79d2e96f79b866688938854e58c14df027 | |
parent | f4ba433b1838c08a37bb2a2d32183f38e8763d64 (diff) | |
download | podman-ee4cab0e096f41f00d84a55dc16b2dc2b9df05e9.tar.gz podman-ee4cab0e096f41f00d84a55dc16b2dc2b9df05e9.tar.bz2 podman-ee4cab0e096f41f00d84a55dc16b2dc2b9df05e9.zip |
logs: k8s-file: restore poll sleep
Commit 84b55eec2796 attempted to fix a race waiting for the container
died event. Previously, Podman slept for duration of the polling
frequence which I considerred to be a mistake. As it turns out, I was
mistaken since the file logger will, in fact, NOT read until EOF and
then stop logging but stop logging immediately _after_ it woke up.
[NO TESTS NEEDED] as the race condition cannot be hit reliably.
Fixes: #10675
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
-rw-r--r-- | libpod/container_log.go | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/libpod/container_log.go b/libpod/container_log.go index 8bbb7ebe8..43b3f7736 100644 --- a/libpod/container_log.go +++ b/libpod/container_log.go @@ -4,10 +4,12 @@ import ( "context" "fmt" "os" + "time" "github.com/containers/podman/v3/libpod/define" "github.com/containers/podman/v3/libpod/events" "github.com/containers/podman/v3/libpod/logs" + "github.com/hpcloud/tail/watch" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -93,11 +95,14 @@ func (c *Container) readFromLogFile(ctx context.Context, options *logs.LogOption }() // Check if container is still running or paused if options.Follow { + // If the container isn't running or if we encountered an error + // getting its state, instruct the logger to read the file + // until EOF. state, err := c.State() if err != nil || state != define.ContainerStateRunning { - // If the container isn't running or if we encountered - // an error getting its state, instruct the logger to - // read the file until EOF. + // Make sure to wait at least for the poll duration + // before stopping the file logger (see #10675). + time.Sleep(watch.POLL_DURATION) tailError := t.StopAtEOF() if tailError != nil && fmt.Sprintf("%v", tailError) != "tail: stop at eof" { logrus.Errorf("Error stopping logger: %v", tailError) @@ -124,6 +129,9 @@ func (c *Container) readFromLogFile(ctx context.Context, options *logs.LogOption // Now wait for the died event and signal to finish // reading the log until EOF. <-eventChannel + // Make sure to wait at least for the poll duration + // before stopping the file logger (see #10675). + time.Sleep(watch.POLL_DURATION) tailError := t.StopAtEOF() if tailError != nil && fmt.Sprintf("%v", tailError) != "tail: stop at eof" { logrus.Errorf("Error stopping logger: %v", tailError) |