diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index 7efee886f..24da24d93 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -1611,7 +1611,10 @@ func (a adminAPIHandlers) ConsoleLogHandler(w http.ResponseWriter, r *http.Reque for { select { - case log := <-logCh: + case log, ok := <-logCh: + if !ok { + return + } if log.SendLog(node, logKind) { if err := enc.Encode(log); err != nil { return diff --git a/cmd/peer-rest-server.go b/cmd/peer-rest-server.go index a74170427..a381f6eca 100644 --- a/cmd/peer-rest-server.go +++ b/cmd/peer-rest-server.go @@ -1130,7 +1130,10 @@ func (s *peerRESTServer) ConsoleLogHandler(w http.ResponseWriter, r *http.Reques enc := gob.NewEncoder(w) for { select { - case entry := <-ch: + case entry, ok := <-ch: + if !ok { + return + } if err := enc.Encode(entry); err != nil { return } diff --git a/internal/logger/message/log/entry.go b/internal/logger/message/log/entry.go index 7a49e5d25..bbb3424df 100644 --- a/internal/logger/message/log/entry.go +++ b/internal/logger/message/log/entry.go @@ -83,7 +83,7 @@ func (l Info) Mask() uint64 { // SendLog returns true if log pertains to node specified in args. func (l Info) SendLog(node string, logKind madmin.LogMask) bool { if logKind.Contains(l.LogKind.LogMask()) { - return node == "" || strings.EqualFold(node, l.NodeName) + return node == "" || strings.EqualFold(node, l.NodeName) && !l.Time.IsZero() } return false } diff --git a/internal/rest/client.go b/internal/rest/client.go index 08b65ef3c..c2e43992f 100644 --- a/internal/rest/client.go +++ b/internal/rest/client.go @@ -199,11 +199,12 @@ func (c *Client) newRequest(ctx context.Context, u *url.URL, body io.Reader) (*h type respBodyMonitor struct { io.ReadCloser + expectTimeouts bool } func (r respBodyMonitor) Read(p []byte) (n int, err error) { n, err = r.ReadCloser.Read(p) - if err != nil && err != io.EOF { + if xnet.IsNetworkOrHostDown(err, r.expectTimeouts) { atomic.AddUint64(&globalStats.errs, 1) } return @@ -211,7 +212,7 @@ func (r respBodyMonitor) Read(p []byte) (n int, err error) { func (r respBodyMonitor) Close() (err error) { err = r.ReadCloser.Close() - if err != nil { + if xnet.IsNetworkOrHostDown(err, r.expectTimeouts) { atomic.AddUint64(&globalStats.errs, 1) } return @@ -297,7 +298,7 @@ func (c *Client) Call(ctx context.Context, method string, values url.Values, bod return nil, errors.New(resp.Status) } if !c.NoMetrics && !c.ExpectTimeouts { - resp.Body = &respBodyMonitor{resp.Body} + resp.Body = &respBodyMonitor{ReadCloser: resp.Body, expectTimeouts: c.ExpectTimeouts} } return resp.Body, nil }