Переглянути джерело

Merge pull request #6918 from vieux/rebase_events_leak

Rebase events leak
Victor Vieux 11 роки тому
батько
коміт
bdf7224941
2 змінених файлів з 23 додано та 2 видалено
  1. 15 0
      integration-cli/docker_cli_events_test.go
  2. 8 2
      server/server.go

+ 15 - 0
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")
+}

+ 8 - 2
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 {