From baebe86844c62f15bd343fa6c38e20f3567cd5b5 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 28 Jul 2020 20:52:00 +0300 Subject: [PATCH] app/vmagent/remotewrite: add missing `resp.Body.Close()` after pushing data to remote storage Missing body close could disable HTTP keep-alive connections. Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/653 --- app/vmagent/remotewrite/client.go | 51 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/app/vmagent/remotewrite/client.go b/app/vmagent/remotewrite/client.go index 77c92ebf64..b33c20f603 100644 --- a/app/vmagent/remotewrite/client.go +++ b/app/vmagent/remotewrite/client.go @@ -220,28 +220,33 @@ again: goto again } statusCode := resp.StatusCode - if statusCode/100 != 2 { - metrics.GetOrCreateCounter(fmt.Sprintf(`vmagent_remotewrite_requests_total{url=%q, status_code="%d"}`, c.urlLabelValue, statusCode)).Inc() - retryDuration *= 2 - if retryDuration > time.Minute { - retryDuration = time.Minute - } - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - logger.Errorf("cannot read response body from %q: %s", c.remoteWriteURL, err) - } else { - logger.Errorf("unexpected status code received after sending a block with size %d bytes to %q: %d; response body=%q; re-sending the block in %.3f seconds", - len(block), c.remoteWriteURL, statusCode, body, retryDuration.Seconds()) - } - t := time.NewTimer(retryDuration) - select { - case <-c.stopCh: - t.Stop() - return - case <-t.C: - } - c.retriesCount.Inc() - goto again + if statusCode/100 == 2 { + _ = resp.Body.Close() + c.requestsOKCount.Inc() + return } - c.requestsOKCount.Inc() + + // Unexpected status code returned + metrics.GetOrCreateCounter(fmt.Sprintf(`vmagent_remotewrite_requests_total{url=%q, status_code="%d"}`, c.urlLabelValue, statusCode)).Inc() + retryDuration *= 2 + if retryDuration > time.Minute { + retryDuration = time.Minute + } + body, err := ioutil.ReadAll(resp.Body) + _ = resp.Body.Close() + if err != nil { + logger.Errorf("cannot read response body from %q: %s", c.remoteWriteURL, err) + } else { + logger.Errorf("unexpected status code received after sending a block with size %d bytes to %q: %d; response body=%q; re-sending the block in %.3f seconds", + len(block), c.remoteWriteURL, statusCode, body, retryDuration.Seconds()) + } + t := time.NewTimer(retryDuration) + select { + case <-c.stopCh: + t.Stop() + return + case <-t.C: + } + c.retriesCount.Inc() + goto again }