On Tue, Feb 07, 2017 at 05:04:18PM -0500, Michael W. Lucas wrote:
> host 104.236.197.233, check send expect (9020ms,tcp read timeout), state 
> unknown -> down, availability 0.00%

The send/expect code looses its error because of its async nature -
it goes like:

1. "we got data, let's verify it"
2. "expect test failed, but maybe we didn't read enough, let's try again"
3. "no more data, timeout"

When we reach 3), the code also has to check if there is anything in
the input buffer from 1) and verify it again.  The following code
fixes it to show "send/expect failed" instead of "tcp read timeout".

Reyk

Index: usr.sbin/relayd/check_tcp.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/check_tcp.c,v
retrieving revision 1.51
diff -u -p -u -p -r1.51 check_tcp.c
--- usr.sbin/relayd/check_tcp.c 11 Jan 2016 21:31:42 -0000      1.51
+++ usr.sbin/relayd/check_tcp.c 8 Feb 2017 23:16:14 -0000
@@ -233,8 +233,12 @@ tcp_read_buf(int s, short event, void *a
        struct ctl_tcp_event    *cte = arg;
 
        if (event == EV_TIMEOUT) {
-               tcp_close(cte, HOST_DOWN);
-               hce_notify_done(cte->host, HCE_TCP_READ_TIMEOUT);
+               if (ibuf_size(cte->buf))
+                       (void)cte->validate_close(cte);
+               else
+                       cte->host->he = HCE_TCP_READ_TIMEOUT;
+               tcp_close(cte, cte->host->up == HOST_UP ? 0 : HOST_DOWN);
+               hce_notify_done(cte->host, cte->host->he);
                return;
        }

Reply via email to