forked from pool/haproxy
Accepting request 254377 from network:ha-clustering:Factory
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
This commit is contained in:
parent
aeb20f101c
commit
9713333582
188
0016-BUG-MEDIUM-http-adjust-close-mode-when-switching-to-.patch
Normal file
188
0016-BUG-MEDIUM-http-adjust-close-mode-when-switching-to-.patch
Normal file
@ -0,0 +1,188 @@
|
||||
From 2e47a3ab11188239abadb6bba7bd901d764aa4fb Mon Sep 17 00:00:00 2001
|
||||
From: Willy Tarreau <w@1wt.eu>
|
||||
Date: Tue, 30 Sep 2014 18:44:22 +0200
|
||||
Subject: [PATCH 16/20] BUG/MEDIUM: http: adjust close mode when switching to
|
||||
backend
|
||||
|
||||
Commit 179085c ("MEDIUM: http: move Connection header processing earlier")
|
||||
introduced a regression : the backend's HTTP mode is not considered anymore
|
||||
when setting the session's HTTP mode, because wait_for_request() is only
|
||||
called once, when the frontend receives the request (or when the frontend
|
||||
is in TCP mode, when the backend receives the request).
|
||||
|
||||
The net effect is that in some situations when the frontend and the backend
|
||||
do not work in the same mode (eg: keep-alive vs close), the backend's mode
|
||||
is ignored.
|
||||
|
||||
This patch moves all that processing to a dedicated function, which is
|
||||
called from the original place, as well as from session_set_backend()
|
||||
when switching from an HTTP frontend to an HTTP backend in different
|
||||
modes.
|
||||
|
||||
This fix must be backported to 1.5.
|
||||
(cherry picked from commit 4e21ff9244aefa56bcf0793a9e07edba2c3c1960)
|
||||
---
|
||||
include/proto/proto_http.h | 1 +
|
||||
src/proto_http.c | 107 +++++++++++++++++++++++----------------------
|
||||
src/proxy.c | 8 ++++
|
||||
3 files changed, 64 insertions(+), 52 deletions(-)
|
||||
|
||||
diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h
|
||||
index e898ca8..8014310 100644
|
||||
--- a/include/proto/proto_http.h
|
||||
+++ b/include/proto/proto_http.h
|
||||
@@ -112,6 +112,7 @@ unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hle
|
||||
void http_init_txn(struct session *s);
|
||||
void http_end_txn(struct session *s);
|
||||
void http_reset_txn(struct session *s);
|
||||
+void http_adjust_conn_mode(struct session *s, struct http_txn *txn, struct http_msg *msg);
|
||||
|
||||
struct http_req_rule *parse_http_req_cond(const char **args, const char *file, int linenum, struct proxy *proxy);
|
||||
struct http_res_rule *parse_http_res_cond(const char **args, const char *file, int linenum, struct proxy *proxy);
|
||||
diff --git a/src/proto_http.c b/src/proto_http.c
|
||||
index 7e35c8b..20e7088 100644
|
||||
--- a/src/proto_http.c
|
||||
+++ b/src/proto_http.c
|
||||
@@ -2393,6 +2393,59 @@ fail:
|
||||
return 0;
|
||||
}
|
||||
|
||||
+void http_adjust_conn_mode(struct session *s, struct http_txn *txn, struct http_msg *msg)
|
||||
+{
|
||||
+ int tmp = TX_CON_WANT_KAL;
|
||||
+
|
||||
+ if (!((s->fe->options2|s->be->options2) & PR_O2_FAKE_KA)) {
|
||||
+ if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_TUN ||
|
||||
+ (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_TUN)
|
||||
+ tmp = TX_CON_WANT_TUN;
|
||||
+
|
||||
+ if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL ||
|
||||
+ (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL)
|
||||
+ tmp = TX_CON_WANT_TUN;
|
||||
+ }
|
||||
+
|
||||
+ if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_SCL ||
|
||||
+ (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_SCL) {
|
||||
+ /* option httpclose + server_close => forceclose */
|
||||
+ if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL ||
|
||||
+ (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL)
|
||||
+ tmp = TX_CON_WANT_CLO;
|
||||
+ else
|
||||
+ tmp = TX_CON_WANT_SCL;
|
||||
+ }
|
||||
+
|
||||
+ if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_FCL ||
|
||||
+ (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_FCL)
|
||||
+ tmp = TX_CON_WANT_CLO;
|
||||
+
|
||||
+ if ((txn->flags & TX_CON_WANT_MSK) < tmp)
|
||||
+ txn->flags = (txn->flags & ~TX_CON_WANT_MSK) | tmp;
|
||||
+
|
||||
+ if (!(txn->flags & TX_HDR_CONN_PRS) &&
|
||||
+ (txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_TUN) {
|
||||
+ /* parse the Connection header and possibly clean it */
|
||||
+ int to_del = 0;
|
||||
+ if ((msg->flags & HTTP_MSGF_VER_11) ||
|
||||
+ ((txn->flags & TX_CON_WANT_MSK) >= TX_CON_WANT_SCL &&
|
||||
+ !((s->fe->options2|s->be->options2) & PR_O2_FAKE_KA)))
|
||||
+ to_del |= 2; /* remove "keep-alive" */
|
||||
+ if (!(msg->flags & HTTP_MSGF_VER_11))
|
||||
+ to_del |= 1; /* remove "close" */
|
||||
+ http_parse_connection_header(txn, msg, to_del);
|
||||
+ }
|
||||
+
|
||||
+ /* check if client or config asks for explicit close in KAL/SCL */
|
||||
+ if (((txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_KAL ||
|
||||
+ (txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_SCL) &&
|
||||
+ ((txn->flags & TX_HDR_CONN_CLO) || /* "connection: close" */
|
||||
+ (!(msg->flags & HTTP_MSGF_VER_11) && !(txn->flags & TX_HDR_CONN_KAL)) || /* no "connection: k-a" in 1.0 */
|
||||
+ !(msg->flags & HTTP_MSGF_XFER_LEN) || /* no length known => close */
|
||||
+ s->fe->state == PR_STSTOPPED)) /* frontend is stopping */
|
||||
+ txn->flags = (txn->flags & ~TX_CON_WANT_MSK) | TX_CON_WANT_CLO;
|
||||
+}
|
||||
|
||||
/* This stream analyser waits for a complete HTTP request. It returns 1 if the
|
||||
* processing can continue on next analysers, or zero if it either needs more
|
||||
@@ -2929,58 +2982,8 @@ int http_wait_for_request(struct session *s, struct channel *req, int an_bit)
|
||||
* time.
|
||||
*/
|
||||
if (!(txn->flags & TX_HDR_CONN_PRS) ||
|
||||
- ((s->fe->options & PR_O_HTTP_MODE) != (s->be->options & PR_O_HTTP_MODE))) {
|
||||
- int tmp = TX_CON_WANT_KAL;
|
||||
-
|
||||
- if (!((s->fe->options2|s->be->options2) & PR_O2_FAKE_KA)) {
|
||||
- if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_TUN ||
|
||||
- (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_TUN)
|
||||
- tmp = TX_CON_WANT_TUN;
|
||||
-
|
||||
- if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL ||
|
||||
- (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL)
|
||||
- tmp = TX_CON_WANT_TUN;
|
||||
- }
|
||||
-
|
||||
- if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_SCL ||
|
||||
- (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_SCL) {
|
||||
- /* option httpclose + server_close => forceclose */
|
||||
- if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL ||
|
||||
- (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_PCL)
|
||||
- tmp = TX_CON_WANT_CLO;
|
||||
- else
|
||||
- tmp = TX_CON_WANT_SCL;
|
||||
- }
|
||||
-
|
||||
- if ((s->fe->options & PR_O_HTTP_MODE) == PR_O_HTTP_FCL ||
|
||||
- (s->be->options & PR_O_HTTP_MODE) == PR_O_HTTP_FCL)
|
||||
- tmp = TX_CON_WANT_CLO;
|
||||
-
|
||||
- if ((txn->flags & TX_CON_WANT_MSK) < tmp)
|
||||
- txn->flags = (txn->flags & ~TX_CON_WANT_MSK) | tmp;
|
||||
-
|
||||
- if (!(txn->flags & TX_HDR_CONN_PRS) &&
|
||||
- (txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_TUN) {
|
||||
- /* parse the Connection header and possibly clean it */
|
||||
- int to_del = 0;
|
||||
- if ((msg->flags & HTTP_MSGF_VER_11) ||
|
||||
- ((txn->flags & TX_CON_WANT_MSK) >= TX_CON_WANT_SCL &&
|
||||
- !((s->fe->options2|s->be->options2) & PR_O2_FAKE_KA)))
|
||||
- to_del |= 2; /* remove "keep-alive" */
|
||||
- if (!(msg->flags & HTTP_MSGF_VER_11))
|
||||
- to_del |= 1; /* remove "close" */
|
||||
- http_parse_connection_header(txn, msg, to_del);
|
||||
- }
|
||||
-
|
||||
- /* check if client or config asks for explicit close in KAL/SCL */
|
||||
- if (((txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_KAL ||
|
||||
- (txn->flags & TX_CON_WANT_MSK) == TX_CON_WANT_SCL) &&
|
||||
- ((txn->flags & TX_HDR_CONN_CLO) || /* "connection: close" */
|
||||
- (!(msg->flags & HTTP_MSGF_VER_11) && !(txn->flags & TX_HDR_CONN_KAL)) || /* no "connection: k-a" in 1.0 */
|
||||
- !(msg->flags & HTTP_MSGF_XFER_LEN) || /* no length known => close */
|
||||
- s->fe->state == PR_STSTOPPED)) /* frontend is stopping */
|
||||
- txn->flags = (txn->flags & ~TX_CON_WANT_MSK) | TX_CON_WANT_CLO;
|
||||
- }
|
||||
+ ((s->fe->options & PR_O_HTTP_MODE) != (s->be->options & PR_O_HTTP_MODE)))
|
||||
+ http_adjust_conn_mode(s, txn, msg);
|
||||
|
||||
/* end of job, return OK */
|
||||
req->analysers &= ~an_bit;
|
||||
diff --git a/src/proxy.c b/src/proxy.c
|
||||
index 02103ee..405c4c4 100644
|
||||
--- a/src/proxy.c
|
||||
+++ b/src/proxy.c
|
||||
@@ -955,6 +955,14 @@ int session_set_backend(struct session *s, struct proxy *be)
|
||||
http_init_txn(s);
|
||||
}
|
||||
|
||||
+ /* If we chain to an HTTP backend running a different HTTP mode, we
|
||||
+ * have to re-adjust the desired keep-alive/close mode to accommodate
|
||||
+ * both the frontend's and the backend's modes.
|
||||
+ */
|
||||
+ if (s->fe->mode == PR_MODE_HTTP && be->mode == PR_MODE_HTTP &&
|
||||
+ ((s->fe->options & PR_O_HTTP_MODE) != (be->options & PR_O_HTTP_MODE)))
|
||||
+ http_adjust_conn_mode(s, &s->txn, &s->txn.req);
|
||||
+
|
||||
/* If an LB algorithm needs to access some pre-parsed body contents,
|
||||
* we must not start to forward anything until the connection is
|
||||
* confirmed otherwise we'll lose the pointer to these data and
|
||||
--
|
||||
1.8.4.5
|
||||
|
@ -0,0 +1,46 @@
|
||||
From b3228c83e320ad168f5b3e6884e771530a68a449 Mon Sep 17 00:00:00 2001
|
||||
From: Willy Tarreau <w@1wt.eu>
|
||||
Date: Wed, 1 Oct 2014 20:50:17 +0200
|
||||
Subject: [PATCH 17/20] BUG/MINOR: config: don't propagate process binding on
|
||||
fatal errors.
|
||||
|
||||
propagate_processes() must not be called with unresolved proxies, but
|
||||
nothing prevents it from being called in check_config_validity(). The
|
||||
resulting effect is that an unresolved proxy can cause a recursion
|
||||
loop if called in such a situation, ending with a segfault after the
|
||||
fatal error report. There's no side effect beyond this.
|
||||
|
||||
This patch refrains from calling the function when any error was met.
|
||||
|
||||
This bug also affects 1.5, it should be backported.
|
||||
(cherry picked from commit acbe8ab38a638a076f8cf9fe2635db0e729d6a1f)
|
||||
---
|
||||
src/cfgparse.c | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
||||
index f723a3a..6e962c8 100644
|
||||
--- a/src/cfgparse.c
|
||||
+++ b/src/cfgparse.c
|
||||
@@ -7112,10 +7112,14 @@ out_uri_auth_compat:
|
||||
global.stats_fe->bind_proc = ~0UL;
|
||||
}
|
||||
|
||||
- /* propagate bindings from frontends to backends */
|
||||
- for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
||||
- if (curproxy->cap & PR_CAP_FE)
|
||||
- propagate_processes(curproxy, NULL);
|
||||
+ /* propagate bindings from frontends to backends. Don't do it if there
|
||||
+ * are any fatal errors as we must not call it with unresolved proxies.
|
||||
+ */
|
||||
+ if (!cfgerr) {
|
||||
+ for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
||||
+ if (curproxy->cap & PR_CAP_FE)
|
||||
+ propagate_processes(curproxy, NULL);
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Bind each unbound backend to all processes when not specified. */
|
||||
--
|
||||
1.8.4.5
|
||||
|
102
0018-BUG-MEDIUM-check-rule-less-tcp-check-must-detect-con.patch
Normal file
102
0018-BUG-MEDIUM-check-rule-less-tcp-check-must-detect-con.patch
Normal file
@ -0,0 +1,102 @@
|
||||
From e61737a721c3b91c79484e51fc1789293b269f9f Mon Sep 17 00:00:00 2001
|
||||
From: Willy Tarreau <w@1wt.eu>
|
||||
Date: Thu, 2 Oct 2014 14:30:14 +0200
|
||||
Subject: [PATCH 18/20] BUG/MEDIUM: check: rule-less tcp-check must detect
|
||||
connect failures
|
||||
|
||||
When "option tcp-check" is specified without any tcp-check rules, the
|
||||
documentation says that it's the same as the default check method. But
|
||||
the code path is a bit different, and we used to consider that since
|
||||
the end of rules was reached, the check is always successful regardless
|
||||
of the connection status.
|
||||
|
||||
This patch reorganizes the error detection, and considers the special
|
||||
case where there's no tcp-check rule as a real L4 check. It also avoids
|
||||
dereferencing the rule list head as a rule by itself.
|
||||
|
||||
While fixing this bug, another one related to the output messages'
|
||||
accuracy was noticed, it will be fixed in a separate commit and is
|
||||
much less important.
|
||||
|
||||
This bug is also present in 1.5, so this fix must be backported.
|
||||
(cherry picked from commit ef953953e7f33c6a72c432fce8d47c2d84c69512)
|
||||
---
|
||||
src/checks.c | 40 +++++++++++++++++++++++++---------------
|
||||
1 file changed, 25 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/src/checks.c b/src/checks.c
|
||||
index f3b2b54..9c1a866 100644
|
||||
--- a/src/checks.c
|
||||
+++ b/src/checks.c
|
||||
@@ -1837,20 +1837,34 @@ static int tcpcheck_get_step_id(struct server *s)
|
||||
static void tcpcheck_main(struct connection *conn)
|
||||
{
|
||||
char *contentptr;
|
||||
- struct list *head = NULL;
|
||||
struct tcpcheck_rule *cur = NULL;
|
||||
int done = 0, ret = 0;
|
||||
-
|
||||
struct check *check = conn->owner;
|
||||
struct server *s = check->server;
|
||||
struct task *t = check->task;
|
||||
+ struct list *head = &s->proxy->tcpcheck_rules;
|
||||
|
||||
- /*
|
||||
- * don't do anything until the connection is established but if we're running
|
||||
- * first step which must be a connect
|
||||
+ /* here, we know that the check is complete or that it failed */
|
||||
+ if (check->result != CHK_RES_UNKNOWN)
|
||||
+ goto out_end_tcpcheck;
|
||||
+
|
||||
+ /* We have 4 possibilities here :
|
||||
+ * 1. we've not yet attempted step 1, and step 1 is a connect, so no
|
||||
+ * connection attempt was made yet ;
|
||||
+ * 2. we've not yet attempted step 1, and step 1 is a not connect or
|
||||
+ * does not exist (no rule), so a connection attempt was made
|
||||
+ * before coming here.
|
||||
+ * 3. we're coming back after having started with step 1, so we may
|
||||
+ * be waiting for a connection attempt to complete.
|
||||
+ * 4. the connection + handshake are complete
|
||||
+ *
|
||||
+ * #2 and #3 are quite similar, we want both the connection and the
|
||||
+ * handshake to complete before going any further. Thus we must always
|
||||
+ * wait for a connection to complete unless we're before and existing
|
||||
+ * step 1.
|
||||
*/
|
||||
- if (check->current_step && (!(conn->flags & CO_FL_CONNECTED))) {
|
||||
- /* update expire time, should be done by process_chk */
|
||||
+ if ((!(conn->flags & CO_FL_CONNECTED) || (conn->flags & CO_FL_HANDSHAKE)) &&
|
||||
+ (check->current_step || LIST_ISEMPTY(head))) {
|
||||
/* we allow up to min(inter, timeout.connect) for a connection
|
||||
* to establish but only when timeout.check is set
|
||||
* as it may be to short for a full check otherwise
|
||||
@@ -1867,12 +1881,11 @@ static void tcpcheck_main(struct connection *conn)
|
||||
return;
|
||||
}
|
||||
|
||||
- /* here, we know that the connection is established */
|
||||
- if (check->result != CHK_RES_UNKNOWN)
|
||||
+ /* special case: option tcp-check with no rule, a connect is enough */
|
||||
+ if (LIST_ISEMPTY(head)) {
|
||||
+ set_server_check_status(check, HCHK_STATUS_L4OK, NULL);
|
||||
goto out_end_tcpcheck;
|
||||
-
|
||||
- /* head is be the first element of the double chained list */
|
||||
- head = &s->proxy->tcpcheck_rules;
|
||||
+ }
|
||||
|
||||
/* no step means first step
|
||||
* initialisation */
|
||||
@@ -1891,9 +1904,6 @@ static void tcpcheck_main(struct connection *conn)
|
||||
cur = check->current_step;
|
||||
}
|
||||
|
||||
- if (conn->flags & CO_FL_HANDSHAKE)
|
||||
- return;
|
||||
-
|
||||
/* It's only the rules which will enable send/recv */
|
||||
__conn_data_stop_both(conn);
|
||||
|
||||
--
|
||||
1.8.4.5
|
||||
|
111
0019-BUG-MINOR-tcp-check-report-the-correct-failed-step-i.patch
Normal file
111
0019-BUG-MINOR-tcp-check-report-the-correct-failed-step-i.patch
Normal file
@ -0,0 +1,111 @@
|
||||
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
|
||||
|
@ -0,0 +1,34 @@
|
||||
From c8d57dec6173430bd5602bb76efff302c51e7803 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Cyril=20Bont=C3=A9?= <cyril.bonte@free.fr>
|
||||
Date: Thu, 2 Oct 2014 19:56:25 +0200
|
||||
Subject: [PATCH 20/20] BUG/MINOR: config: don't propagate process binding for
|
||||
dynamic use_backend
|
||||
|
||||
A segfault was reported with the introduction of the propagate_processes()
|
||||
function. It was caused when a use_backend rule was declared with a dynamic
|
||||
name, using a log-format string. The backend is not resolved during the
|
||||
configuration, which lead to the segfault.
|
||||
|
||||
The patch prevents the process binding propagation for such dynamic rules, it
|
||||
should also be backported to 1.5.
|
||||
(cherry picked from commit 51639696e0a112ea3612e905a5722ad912b3869f)
|
||||
---
|
||||
src/cfgparse.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
||||
index 6e962c8..ec6d923 100644
|
||||
--- a/src/cfgparse.c
|
||||
+++ b/src/cfgparse.c
|
||||
@@ -6015,6 +6015,8 @@ void propagate_processes(struct proxy *from, struct proxy *to)
|
||||
|
||||
/* use_backend */
|
||||
list_for_each_entry(rule, &from->switching_rules, list) {
|
||||
+ if (rule->dynamic)
|
||||
+ continue;
|
||||
to = rule->be.backend;
|
||||
propagate_processes(from, to);
|
||||
}
|
||||
--
|
||||
1.8.4.5
|
||||
|
@ -1,3 +1,20 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 6 09:09:58 UTC 2014 - kgronlund@suse.com
|
||||
|
||||
- Backported fixes:
|
||||
- BUG/MEDIUM: http: adjust close mode when switching to backend
|
||||
- BUG/MINOR: config: don't propagate process binding on fatal errors.
|
||||
- BUG/MEDIUM: check: rule-less tcp-check must detect connect failures
|
||||
- BUG/MINOR: tcp-check: report the correct failed step in the status
|
||||
- BUG/MINOR: config: don't propagate process binding for dynamic use_backend
|
||||
|
||||
- Added patches:
|
||||
- 0016-BUG-MEDIUM-http-adjust-close-mode-when-switching-to-.patch
|
||||
- 0017-BUG-MINOR-config-don-t-propagate-process-binding-on-.patch
|
||||
- 0018-BUG-MEDIUM-check-rule-less-tcp-check-must-detect-con.patch
|
||||
- 0019-BUG-MINOR-tcp-check-report-the-correct-failed-step-i.patch
|
||||
- 0020-BUG-MINOR-config-don-t-propagate-process-binding-for.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Sep 25 16:10:08 UTC 2014 - kgronlund@suse.com
|
||||
|
||||
|
16
haproxy.spec
16
haproxy.spec
@ -91,6 +91,17 @@ Patch17: 0013-MINOR-config-detect-the-case-where-a-tcp-request-con.patch
|
||||
Patch18: 0014-MEDIUM-systemd-wrapper-support-multiple-executable-v.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MEDIUM: remove debugging code from systemd-wrapper
|
||||
Patch19: 0015-BUG-MEDIUM-remove-debugging-code-from-systemd-wrappe.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MEDIUM: http: adjust close mode when switching to backend
|
||||
Patch20: 0016-BUG-MEDIUM-http-adjust-close-mode-when-switching-to-.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MINOR: config: don't propagate process binding on fatal errors.
|
||||
Patch21: 0017-BUG-MINOR-config-don-t-propagate-process-binding-on-.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MEDIUM: check: rule-less tcp-check must detect connect failures
|
||||
Patch22: 0018-BUG-MEDIUM-check-rule-less-tcp-check-must-detect-con.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MINOR: tcp-check: report the correct failed step in the status
|
||||
Patch23: 0019-BUG-MINOR-tcp-check-report-the-correct-failed-step-i.patch
|
||||
# PATCH-FIX-UPSTREAM: BUG/MINOR: config: don't propagate process binding for dynamic use_backend
|
||||
Patch24: 0020-BUG-MINOR-config-don-t-propagate-process-binding-for.patch
|
||||
|
||||
Source99: haproxy-rpmlintrc
|
||||
#
|
||||
Summary: The Reliable, High Performance TCP/HTTP Load Balancer
|
||||
@ -139,6 +150,11 @@ the most work done from every CPU cycle.
|
||||
%patch17 -p1
|
||||
%patch18 -p1
|
||||
%patch19 -p1
|
||||
%patch20 -p1
|
||||
%patch21 -p1
|
||||
%patch22 -p1
|
||||
%patch23 -p1
|
||||
%patch24 -p1
|
||||
|
||||
%build
|
||||
%{__make} \
|
||||
|
Loading…
Reference in New Issue
Block a user