From 13e7613ad02ef7f0bee037d29fd9df137f20f2a1 Mon Sep 17 00:00:00 2001 From: Sam Reis Date: Fri, 4 Jul 2014 12:47:28 +1000 Subject: [PATCH 1/3] Fix server leaking events Solves #6843. Docker-DCO-1.1-Signed-off-by: Samuel Reis (github: srijs) Upstream-commit: 5d4986c755526ad5d249ba96eb6213ce089a9c25 Component: engine --- components/engine/server/server.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 { From bbaf2a8ed628b37cb69c378a7882de9a86163e6d Mon Sep 17 00:00:00 2001 From: Sam Reis Date: Fri, 4 Jul 2014 15:12:21 +1000 Subject: [PATCH 2/3] Add test for event limitation Docker-DCO-1.1-Signed-off-by: Samuel Reis (github: srijs) Upstream-commit: 46747963b603a5573a0b26dcef407a96757926e7 Component: engine --- .../integration-cli/docker_cli_events_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/engine/integration-cli/docker_cli_events_test.go b/components/engine/integration-cli/docker_cli_events_test.go index c82322c779..7070747533 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") +} From 4eb22040d967ae904cac6f111b7cf52e7b69f8ab Mon Sep 17 00:00:00 2001 From: Sam Rijs Date: Wed, 9 Jul 2014 09:35:08 +1000 Subject: [PATCH 3/3] avoid regression in events test Docker-DCO-1.1-Signed-off-by: Samuel Reis (github: srijs) Upstream-commit: 560eb07009d65fbcfb49b2fa8b04a2e3f4d647e8 Component: engine --- components/engine/integration-cli/docker_cli_events_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/integration-cli/docker_cli_events_test.go b/components/engine/integration-cli/docker_cli_events_test.go index 7070747533..34d7db0d5a 100644 --- a/components/engine/integration-cli/docker_cli_events_test.go +++ b/components/engine/integration-cli/docker_cli_events_test.go @@ -65,7 +65,7 @@ func TestCLILimitEvents(t *testing.T) { out, _, _ := runCommandWithOutput(eventsCmd) events := strings.Split(out, "\n") n_events := len(events) - 1 - if n_events > 64 { + if n_events != 64 { t.Fatalf("events should be limited to 64, but received %d", n_events) } logDone("events - limited to 64 entries")