mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-20 21:31:28 +02:00
BUG/MEDIUM: sink: fix unexpected double postinit of sink backend
Willy experienced an unexpected behavior with the config below: global stats socket :1514 ring buf1 server srv1 127.0.0.1:1514 Indeed, haproxy would connect to the ring server twice since commit 23e5f18b ("MEDIUM: sink: change the sink mode type to PR_MODE_SYSLOG"), and one of the connection would report errors. The reason behind is is, despite the above commit saying no change of behavior is expected, with the sink forward_px proxy now being set with PR_MODE_SYSLOG, postcheck_log_backend() was being automatically executed in addition to the manual cfg_post_parse_ring() function for each "ring" section. The consequence is that sink_finalize() was called twice for a given "ring" section, which means the connection init would be triggered twice.. which in turn resulted in the behavior described above, plus possible unexpected side-effects. To fix the issue, when we create the forward_px proxy, we now set the PR_CAP_INT capability on it to tell haproxy not to automatically manage the proxy (ie: to skip the automatic log backend postinit), because we are about to manually manage the proxy from the sink API. No backport needed, this bug is specific to 3.3
This commit is contained in:
parent
79ef362d9e
commit
40eb1dd135
@ -1350,8 +1350,8 @@ static int postcheck_log_backend(struct proxy *be)
|
|||||||
int err_code = ERR_NONE;
|
int err_code = ERR_NONE;
|
||||||
int target_type = -1; // -1 is unused in log_tgt enum
|
int target_type = -1; // -1 is unused in log_tgt enum
|
||||||
|
|
||||||
if (!(be->cap & PR_CAP_BE) || be->mode != PR_MODE_SYSLOG ||
|
if ((be->cap & PR_CAP_INT) || !(be->cap & PR_CAP_BE) ||
|
||||||
(be->flags & (PR_FL_DISABLED|PR_FL_STOPPED)))
|
be->mode != PR_MODE_SYSLOG || (be->flags & (PR_FL_DISABLED|PR_FL_STOPPED)))
|
||||||
return ERR_NONE; /* nothing to do */
|
return ERR_NONE; /* nothing to do */
|
||||||
|
|
||||||
err_code |= _postcheck_log_backend_compat(be);
|
err_code |= _postcheck_log_backend_compat(be);
|
||||||
|
@ -842,8 +842,11 @@ static struct sink *sink_new_ringbuf(const char *id, const char *description,
|
|||||||
struct sink *sink;
|
struct sink *sink;
|
||||||
struct proxy *p = NULL; // forward_px
|
struct proxy *p = NULL; // forward_px
|
||||||
|
|
||||||
/* allocate new proxy to handle forwards */
|
/* allocate new proxy to handle forwards, mark it as internal proxy
|
||||||
p = alloc_new_proxy(id, PR_CAP_BE, err_msg);
|
* because we don't want haproxy to do the automatic syslog backend
|
||||||
|
* init, instead we will manage it by hand
|
||||||
|
*/
|
||||||
|
p = alloc_new_proxy(id, PR_CAP_BE|PR_CAP_INT, err_msg);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user