1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 21:33:18 +01:00

Fixes memory leaks

This commit is contained in:
Amir Raminfar
2018-11-27 11:13:02 -08:00
parent 537f7c0a01
commit 93cfd0e597
2 changed files with 38 additions and 22 deletions

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ node_modules
static static
a_main-packr.go a_main-packr.go
dozzle dozzle
gin-bin

57
main.go
View File

@@ -122,6 +122,10 @@ func streamLogs(w http.ResponseWriter, r *http.Request) {
return return
} }
defer reader.Close() defer reader.Close()
go func() {
<-r.Context().Done()
reader.Close()
}()
w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Cache-Control", "no-cache")
@@ -133,17 +137,15 @@ func streamLogs(w http.ResponseWriter, r *http.Request) {
for { for {
_, err := reader.Read(hdr) _, err := reader.Read(hdr)
if err != nil { if err != nil {
log.Panicln(err) break
} }
count := binary.BigEndian.Uint32(hdr[4:]) count := binary.BigEndian.Uint32(hdr[4:])
n, err := reader.Read(content[:count]) n, err := reader.Read(content[:count])
if err != nil { if err != nil {
log.Println(err)
break break
} }
_, err = fmt.Fprintf(w, "data: %s\n\n", content[:n]) _, err = fmt.Fprintf(w, "data: %s\n\n", content[:n])
if err != nil { if err != nil {
log.Println(err)
break break
} }
f.Flush() f.Flush()
@@ -166,25 +168,38 @@ func streamEvents(w http.ResponseWriter, r *http.Request) {
defer cancel() defer cancel()
messages, _ := dockerClient.Events(ctx) messages, _ := dockerClient.Events(ctx)
for message := range messages { for {
switch message.Action { exit := false
case "connect": select {
fallthrough case message, closed := <-messages:
case "disconnect": if closed {
fallthrough log.Println("Breaking from messages")
case "create": exit = true
fallthrough
case "destroy":
_, err := fmt.Fprintf(w, "event: containers-changed\n")
_, err = fmt.Fprintf(w, "data: %s\n\n", message.Action)
if err != nil {
log.Println(err)
break
} }
f.Flush() switch message.Action {
default: case "connect":
// Do nothing fallthrough
case "disconnect":
fallthrough
case "create":
fallthrough
case "destroy":
_, err := fmt.Fprintf(w, "event: containers-changed\n")
_, err = fmt.Fprintf(w, "data: %s\n\n", message.Action)
if err != nil {
log.Println(err)
break
}
f.Flush()
}
case <-r.Context().Done():
cancel()
exit = true
}
if exit {
break
} }
} }
} }