forked from pool/haproxy
9713333582
1 OBS-URL: https://build.opensuse.org/request/show/254377 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/haproxy?expand=0&rev=14
112 lines
4.0 KiB
Diff
112 lines
4.0 KiB
Diff
From 90055f28a7a0c86cfb37ccb23a548a1da7229551 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Thu, 2 Oct 2014 14:51:02 +0200
|
|
Subject: [PATCH 19/20] BUG/MINOR: tcp-check: report the correct failed step in
|
|
the status
|
|
|
|
The step number was reported by checking only last_started_step, which
|
|
was not set in case of error during the initial connection phase, and
|
|
caused "step 1" to be returned with an invalid check type (typically
|
|
SEND). So now we first verify that a test was started before returning
|
|
this.
|
|
|
|
In addition to this, the indication of the test type was taken from
|
|
current_step instead of last_started_step, so the error description
|
|
was matching the next action instead of the one reported in the step
|
|
ID. Thus we could get the confusing "step 1 (send)" report below :
|
|
|
|
tcp-check connect
|
|
tcp-check send foo
|
|
|
|
In order to ease debugging, when the port number is known for a connect,
|
|
it is indicated in the error report.
|
|
|
|
Note that this only affects asynchronous error messages, synchronous ones
|
|
are correct.
|
|
|
|
This fix must be backported to 1.5.
|
|
(cherry picked from commit 213c6785614d0228d7e96e982e5189e1d0777059)
|
|
---
|
|
src/checks.c | 43 ++++++++++++++++++++++++++++---------------
|
|
1 file changed, 28 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/src/checks.c b/src/checks.c
|
|
index 9c1a866..5318f35 100644
|
|
--- a/src/checks.c
|
|
+++ b/src/checks.c
|
|
@@ -580,6 +580,7 @@ static void chk_report_conn_err(struct connection *conn, int errno_bck, int expi
|
|
struct check *check = conn->owner;
|
|
const char *err_msg;
|
|
struct chunk *chk;
|
|
+ int step;
|
|
|
|
if (check->result != CHK_RES_UNKNOWN)
|
|
return;
|
|
@@ -599,19 +600,27 @@ static void chk_report_conn_err(struct connection *conn, int errno_bck, int expi
|
|
chk = get_trash_chunk();
|
|
|
|
if (check->type == PR_O2_TCPCHK_CHK) {
|
|
- chunk_printf(chk, " at step %d of tcp-check", tcpcheck_get_step_id(check->server));
|
|
- /* we were looking for a string */
|
|
- if (check->current_step && check->current_step->action == TCPCHK_ACT_CONNECT) {
|
|
- chunk_appendf(chk, " (connect)");
|
|
- }
|
|
- else if (check->current_step && check->current_step->action == TCPCHK_ACT_EXPECT) {
|
|
- if (check->current_step->string)
|
|
- chunk_appendf(chk, " (string '%s')", check->current_step->string);
|
|
- else if (check->current_step->expect_regex)
|
|
- chunk_appendf(chk, " (expect regex)");
|
|
- }
|
|
- else if (check->current_step && check->current_step->action == TCPCHK_ACT_SEND) {
|
|
- chunk_appendf(chk, " (send)");
|
|
+ step = tcpcheck_get_step_id(check->server);
|
|
+ if (!step)
|
|
+ chunk_printf(chk, " at initial connection step of tcp-check");
|
|
+ else {
|
|
+ chunk_printf(chk, " at step %d of tcp-check", step);
|
|
+ /* we were looking for a string */
|
|
+ if (check->last_started_step && check->last_started_step->action == TCPCHK_ACT_CONNECT) {
|
|
+ if (check->last_started_step->port)
|
|
+ chunk_appendf(chk, " (connect port %d)" ,check->last_started_step->port);
|
|
+ else
|
|
+ chunk_appendf(chk, " (connect)");
|
|
+ }
|
|
+ else if (check->last_started_step && check->last_started_step->action == TCPCHK_ACT_EXPECT) {
|
|
+ if (check->last_started_step->string)
|
|
+ chunk_appendf(chk, " (string '%s')", check->last_started_step->string);
|
|
+ else if (check->last_started_step->expect_regex)
|
|
+ chunk_appendf(chk, " (expect regex)");
|
|
+ }
|
|
+ else if (check->last_started_step && check->last_started_step->action == TCPCHK_ACT_SEND) {
|
|
+ chunk_appendf(chk, " (send)");
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -1818,6 +1827,10 @@ static int tcpcheck_get_step_id(struct server *s)
|
|
struct tcpcheck_rule *cur = NULL, *next = NULL;
|
|
int i = 0;
|
|
|
|
+ /* not even started anything yet => step 0 = initial connect */
|
|
+ if (!s->check.current_step)
|
|
+ return 0;
|
|
+
|
|
cur = s->check.last_started_step;
|
|
|
|
/* no step => first step */
|
|
@@ -1887,9 +1900,9 @@ static void tcpcheck_main(struct connection *conn)
|
|
goto out_end_tcpcheck;
|
|
}
|
|
|
|
- /* no step means first step
|
|
- * initialisation */
|
|
+ /* no step means first step initialisation */
|
|
if (check->current_step == NULL) {
|
|
+ check->last_started_step = NULL;
|
|
check->bo->p = check->bo->data;
|
|
check->bo->o = 0;
|
|
check->bi->p = check->bi->data;
|
|
--
|
|
1.8.4.5
|
|
|