hi there, Following up some recent discussion about SRV record's weight and server weight in HAProxy, we spotted a bug in the current code: when weight in SRV record is set to 0, then server weight in HAProxy was 1... Thanks to Willy for proposing the solution applied into that patch.
Baptiste
From 35598ed8ffce74e4cc834566566957dde5ede167 Mon Sep 17 00:00:00 2001 From: Baptiste Assmann <[email protected]> Date: Mon, 21 Oct 2019 15:13:48 +0200 Subject: [PATCH] BUG/MINOR: dns: allow srv record weight set to 0 Processing of SRV record weight was inaccurate and when a SRV record's weight was set to 0, HAProxy enforced it to '1'. This patch aims at fixing this without breaking compability with previous behavior. Backport status: 1.8 to 2.0 --- src/dns.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/dns.c b/src/dns.c index 0ce6e8302..813dfc3fc 100644 --- a/src/dns.c +++ b/src/dns.c @@ -543,10 +543,12 @@ static void dns_check_dns_response(struct dns_resolution *res) !memcmp(srv->hostname_dn, item->target, item->data_len)) { int ha_weight; - /* Make sure weight is at least 1, so - * that the server will be used. + /* DNS weight range if from 0 to 65535 + * HAProxy weight is from 0 to 255 + * The rule below ensures that weight 0 is well respected + * while allowing a "mapping" from DNS weight into HAProxy's one. */ - ha_weight = item->weight / 256 + 1; + ha_weight = item->weight + 255 / 256; if (srv->uweight != ha_weight) { char weight[9]; @@ -590,10 +592,12 @@ static void dns_check_dns_response(struct dns_resolution *res) !(srv->flags & SRV_F_CHECKPORT)) srv->check.port = item->port; - /* Make sure weight is at least 1, so - * that the server will be used. + /* DNS weight range if from 0 to 65535 + * HAProxy weight is from 0 to 255 + * The rule below ensures that weight 0 is well respected + * while allowing a "mapping" from DNS weight into HAProxy's one. */ - ha_weight = item->weight / 256 + 1; + ha_weight = item->weight + 255 / 256; snprintf(weight, sizeof(weight), "%d", ha_weight); server_parse_weight_change_request(srv, weight); -- 2.17.1

