|
From ebb2bceb34d7787453548627ed0e99c60354672b Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Wed, 13 May 2015 11:59:14 +0200
|
|
Subject: [PATCH 6/8] CLEANUP: checks: simplify the loop processing of
|
|
tcp-checks
|
|
|
|
There is some unobvious redundancy between the various ways we can leave
|
|
the loop. Some of them can be factored out. So now we leave the loop when
|
|
we can't go further, whether it's caused by reaching the end of the rules
|
|
or by a blocking I/O.
|
|
(cherry picked from commit 263013d031d754c9f96de0d0cb5afcc011af6441)
|
|
[wt: this patch is required for the next fix]
|
|
---
|
|
src/checks.c | 26 ++++++++++++++------------
|
|
1 file changed, 14 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/src/checks.c b/src/checks.c
|
|
index a887be1..a0c42f2 100644
|
|
--- a/src/checks.c
|
|
+++ b/src/checks.c
|
|
@@ -1926,8 +1926,10 @@ static void tcpcheck_main(struct connection *conn)
|
|
__conn_data_stop_both(conn);
|
|
|
|
while (1) {
|
|
- /* we have to try to flush the output buffer before reading, at the end,
|
|
- * or if we're about to send a string that does not fit in the remaining space.
|
|
+ /* We have to try to flush the output buffer before reading, at
|
|
+ * the end, or if we're about to send a string that does not fit
|
|
+ * in the remaining space. That explains why we break out of the
|
|
+ * loop after this control.
|
|
*/
|
|
if (check->bo->o &&
|
|
(&check->current_step->list == head ||
|
|
@@ -1940,16 +1942,12 @@ static void tcpcheck_main(struct connection *conn)
|
|
__conn_data_stop_both(conn);
|
|
goto out_end_tcpcheck;
|
|
}
|
|
- goto out_need_io;
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
- /* did we reach the end ? If so, let's check that everything was sent */
|
|
- if (&check->current_step->list == head) {
|
|
- if (check->bo->o)
|
|
- goto out_need_io;
|
|
+ if (&check->current_step->list == head)
|
|
break;
|
|
- }
|
|
|
|
/* have 'next' point to the next rule or NULL if we're on the
|
|
* last one, connect() needs this.
|
|
@@ -2131,7 +2129,7 @@ static void tcpcheck_main(struct connection *conn)
|
|
}
|
|
}
|
|
else
|
|
- goto out_need_io;
|
|
+ break;
|
|
}
|
|
|
|
/* mark the step as started */
|
|
@@ -2233,10 +2231,14 @@ static void tcpcheck_main(struct connection *conn)
|
|
} /* end expect */
|
|
} /* end loop over double chained step list */
|
|
|
|
- set_server_check_status(check, HCHK_STATUS_L7OKD, "(tcp-check)");
|
|
- goto out_end_tcpcheck;
|
|
+ /* We're waiting for some I/O to complete, we've reached the end of the
|
|
+ * rules, or both. Do what we have to do, otherwise we're done.
|
|
+ */
|
|
+ if (&check->current_step->list == head && !check->bo->o) {
|
|
+ set_server_check_status(check, HCHK_STATUS_L7OKD, "(tcp-check)");
|
|
+ goto out_end_tcpcheck;
|
|
+ }
|
|
|
|
- out_need_io:
|
|
/* warning, current_step may now point to the head */
|
|
if (check->bo->o)
|
|
__conn_data_want_send(conn);
|
|
--
|
|
2.0.5
|
|
|