From e4bd01e0c706fedca7e2584322d3e458569f40a4 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Thu, 24 Jun 2021 22:50:24 +0200 Subject: [PATCH] Exclude read-timeout from being an error (#9429) --- plugins/inputs/dovecot/dovecot.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/inputs/dovecot/dovecot.go b/plugins/inputs/dovecot/dovecot.go index ab5067534..fbc3b7905 100644 --- a/plugins/inputs/dovecot/dovecot.go +++ b/plugins/inputs/dovecot/dovecot.go @@ -93,7 +93,7 @@ func (d *Dovecot) gatherServer(addr string, acc telegraf.Accumulator, qtype stri c, err := net.DialTimeout(proto, addr, defaultTimeout) if err != nil { - return fmt.Errorf("enable to connect to dovecot server '%s': %s", addr, err) + return fmt.Errorf("unable to connect to dovecot server '%s': %s", addr, err) } defer c.Close() @@ -113,7 +113,12 @@ func (d *Dovecot) gatherServer(addr string, acc telegraf.Accumulator, qtype stri } var buf bytes.Buffer if _, err := io.Copy(&buf, c); err != nil { - return fmt.Errorf("copying message failed for dovecot server '%s': %s", addr, err) + // We need to accept the timeout here as reading from the connection will only terminate on EOF + // or on a timeout to happen. As EOF for TCP connections will only be sent on connection closing, + // the only way to get the whole message is to wait for the timeout to happen. + if nerr, ok := err.(net.Error); !ok || !nerr.Timeout() { + return fmt.Errorf("copying message failed for dovecot server '%s': %s", addr, err) + } } var host string