From 7151076522eface09dc3268e9d12286ff570e9b0 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 1 Mar 2024 16:17:47 +0100 Subject: [PATCH] BUG/MINOR: tools: seed the statistical PRNG slightly better Thomas Baroux reported a very interesting issue. "balance random" would systematically assign the same server first upon restart. That comes from its use of statistical_prng() which is only seeded with the thread number, and since at low loads threads are assigned to incoming connections in round robin order, practically speaking, the same thread always gets the same request and will produce the same random number. We already have a much better RNG that's also way more expensive, but we can use it at boot time to seed the PRNG instead of using the thread ID only. This needs to be backported to 2.4. --- src/tools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.c b/src/tools.c index b2814b5af..e1ba2411e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -6333,7 +6333,7 @@ void *dlopen(const char *filename, int flags) static int init_tools_per_thread() { /* Let's make each thread start from a different position */ - statistical_prng_state += tid * MAX_THREADS; + statistical_prng_state += ha_random32(); if (!statistical_prng_state) statistical_prng_state++; return 1;