BUG/MEDIUM: rhttp: fix preconnect on single-thread

On initialization of a rhttp bind, the first thread available on the
listener is selected to execute the first occurence of the preconnect
task.

This thread selection was incorrect as it used my_ffsl() which returns
value indexed from 1, contrary to tid which are indexed from 0. This
cause the first listener thread to be skipped in favor of the second
one. Worst, if haproxy runs in single-thread mode, calculated thread ID
will be invalid and the task will never run, which prevent any
preconnect execution.

Fix this by substracting the result of my_ffsl() by 1 to have a value
indexed from 0.

This must be backported up to 2.9.
This commit is contained in:
Amaury Denoyelle 2024-05-21 16:35:28 +02:00
parent 4f80543220
commit ceebb09744

View File

@ -291,7 +291,7 @@ int rhttp_bind_listener(struct listener *listener, char *errmsg, int errlen)
/* Retrieve the first thread usable for this listener. */
mask = listener->rx.bind_thread & _HA_ATOMIC_LOAD(&tg->threads_enabled);
task_tid = my_ffsl(mask) + ha_tgroup_info[listener->rx.bind_tgroup].base;
task_tid = my_ffsl(mask) - 1 + ha_tgroup_info[listener->rx.bind_tgroup].base;
if (!(task = task_new_on(task_tid))) {
snprintf(errmsg, errlen, "Out of memory.");
goto err;