- [PATCH 1/2] BUG/MEDIUM: stats: properly initialize the scope before - [PATCH 2/2] BUG/MEDIUM: http: don't forward client shutdown without - [PATCH 3/8] BUG/MINOR: check: fix tcpcheck error message - [PATCH 4/8] CLEANUP: checks: fix double usage of cur / current_step - [PATCH 5/8] BUG/MEDIUM: checks: do not dereference head of a - [PATCH 6/8] CLEANUP: checks: simplify the loop processing of - [PATCH 7/8] BUG/MAJOR: checks: always check for end of list before - [PATCH 8/8] BUG/MEDIUM: checks: do not dereference a list as a - [PATCH 09/10] BUG/MEDIUM: peers: apply a random reconnection timeout - [PATCH 10/10] DOC: Update doc about weight, act and bck fields in the - [PATCH 11/14] MINOR: ssl: add a destructor to free allocated SSL - [PATCH 12/14] BUG/MEDIUM: ssl: fix tune.ssl.default-dh-param value - [PATCH 13/14] BUG/MINOR: cfgparse: fix typo in 'option httplog' error - [PATCH 14/14] BUG/MEDIUM: cfgparse: segfault when userlist is misused Signed-off-by: heil <heil@terminal-consulting.de>
82 lines
2.7 KiB
Diff
82 lines
2.7 KiB
Diff
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
|
|
|