stats: detect closed client connection

Detect closed client connections and stop streaming.

Fixes: #7521
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
Valentin Rothberg
2020-09-18 13:56:31 +02:00
parent c6410076b0
commit ae0e4dfd75

View File

@ -86,7 +86,12 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
coder := json.NewEncoder(w) coder := json.NewEncoder(w)
coder.SetEscapeHTML(true) coder.SetEscapeHTML(true)
for ok := true; ok; ok = query.Stream { streamLabel: // A label to flatten the scope
select {
case <-r.Context().Done():
logrus.Debugf("Client connection (container stats) cancelled")
default:
// Container stats // Container stats
stats, err := ctnr.GetContainerStats(stats) stats, err := ctnr.GetContainerStats(stats)
if err != nil { if err != nil {
@ -194,6 +199,10 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
flusher.Flush() flusher.Flush()
} }
if !query.Stream {
return
}
preRead = s.Read preRead = s.Read
bits, err := json.Marshal(s.CPUStats) bits, err := json.Marshal(s.CPUStats)
if err != nil { if err != nil {
@ -203,10 +212,8 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
logrus.Errorf("Unable to unmarshal previous stats: %q", err) logrus.Errorf("Unable to unmarshal previous stats: %q", err)
} }
// Only sleep when we're streaming.
if query.Stream {
time.Sleep(DefaultStatsPeriod) time.Sleep(DefaultStatsPeriod)
} goto streamLabel
} }
} }