diff --git a/components/engine/integration-cli/docker_cli_events_test.go b/components/engine/integration-cli/docker_cli_events_test.go index c82322c779..34d7db0d5a 100644 --- a/components/engine/integration-cli/docker_cli_events_test.go +++ b/components/engine/integration-cli/docker_cli_events_test.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os/exec" + "strconv" "strings" "testing" "time" @@ -55,3 +56,17 @@ func TestCLIGetEventsPause(t *testing.T) { logDone("events - pause/unpause is logged") } + +func TestCLILimitEvents(t *testing.T) { + for i := 0; i < 30; i++ { + cmd(t, "run", "busybox", "echo", strconv.Itoa(i)) + } + eventsCmd := exec.Command(dockerBinary, "events", "--since=0", fmt.Sprintf("--until=%d", time.Now().Unix())) + out, _, _ := runCommandWithOutput(eventsCmd) + events := strings.Split(out, "\n") + n_events := len(events) - 1 + if n_events != 64 { + t.Fatalf("events should be limited to 64, but received %d", n_events) + } + logDone("events - limited to 64 entries") +} diff --git a/components/engine/server/server.go b/components/engine/server/server.go index e9a2c93819..2bbada5a1d 100644 --- a/components/engine/server/server.go +++ b/components/engine/server/server.go @@ -2463,8 +2463,14 @@ func (srv *Server) LogEvent(action, id, from string) *utils.JSONMessage { func (srv *Server) AddEvent(jm utils.JSONMessage) { srv.Lock() - defer srv.Unlock() - srv.events = append(srv.events, jm) + if len(srv.events) == cap(srv.events) { + // discard oldest event + copy(srv.events, srv.events[1:]) + srv.events[len(srv.events)-1] = jm + } else { + srv.events = append(srv.events, jm) + } + srv.Unlock() } func (srv *Server) GetEvents() []utils.JSONMessage {