mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-05-14 05:38:05 +00:00
BUG/MEDIUM: checks: Make sure we set the task affinity just before connecting.
In process_chk_conn(), make sure we set the task affinity to the current thread as soon as we're attempting a connection (and reset the affinity to "any thread" if we detect a failure). We used to only set the task affinity if connect_conn_chk() returned SF_ERR_NONE, however for TCP checks, SF_ERR_UP is returned, so for those checks, the task could still run on any thread, and this could lead to a race condition where the connection runs on one thread, while the task runs on another one, which could create random memory corruption and/or crashes. This may fix github issue #369. This should be backported to 2.1, 2.0 and 1.9.
This commit is contained in:
parent
0742c314c3
commit
aebeff74fc
@ -2245,6 +2245,7 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho
|
|||||||
b_reset(&check->bi);
|
b_reset(&check->bi);
|
||||||
b_reset(&check->bo);
|
b_reset(&check->bo);
|
||||||
|
|
||||||
|
task_set_affinity(t, tid_bit);
|
||||||
ret = connect_conn_chk(t);
|
ret = connect_conn_chk(t);
|
||||||
cs = check->cs;
|
cs = check->cs;
|
||||||
conn = cs_conn(cs);
|
conn = cs_conn(cs);
|
||||||
@ -2276,7 +2277,6 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho
|
|||||||
__event_srv_chk_r(cs);
|
__event_srv_chk_r(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
task_set_affinity(t, tid_bit);
|
|
||||||
goto reschedule;
|
goto reschedule;
|
||||||
|
|
||||||
case SF_ERR_SRVTO: /* ETIMEDOUT */
|
case SF_ERR_SRVTO: /* ETIMEDOUT */
|
||||||
@ -2298,6 +2298,7 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* here, we have seen a synchronous error, no fd was allocated */
|
/* here, we have seen a synchronous error, no fd was allocated */
|
||||||
|
task_set_affinity(t, MAX_THREADS_MASK);
|
||||||
if (cs) {
|
if (cs) {
|
||||||
if (check->wait_list.events)
|
if (check->wait_list.events)
|
||||||
cs->conn->xprt->unsubscribe(cs->conn,
|
cs->conn->xprt->unsubscribe(cs->conn,
|
||||||
|
Loading…
Reference in New Issue
Block a user