diff --git a/doc/configuration.txt b/doc/configuration.txt index 463d17275..2407fcb01 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -11931,6 +11931,11 @@ resolve-opts ,,... For such case, simply enable this option. This is the opposite of prevent-dup-ip. + * ignore-weight + Ignore any weight that is set within an SRV record. This is useful when + you would like to control the weights using an alternate method, such as + using an "agent-check" or through the runtime api. + * prevent-dup-ip Ensure HAProxy's default behavior is enforced on a server: prevent re-using an IP address already set to a server in the same backend and sharing the diff --git a/include/types/dns.h b/include/types/dns.h index 5a60c0708..8347e93ab 100644 --- a/include/types/dns.h +++ b/include/types/dns.h @@ -249,6 +249,7 @@ struct dns_options { int pref_net_nb; /* The number of registered preferred networks. */ int accept_duplicate_ip; /* flag to indicate whether the associated object can use an IP address already set to an other object of the same group */ + int ignore_weight; /* flag to indicate whether to ignore the weight within the record */ }; /* Resolution structure associated to single server and used to manage name diff --git a/src/dns.c b/src/dns.c index 5f9e7eae5..6e726bf96 100644 --- a/src/dns.c +++ b/src/dns.c @@ -537,7 +537,8 @@ static void dns_check_dns_response(struct dns_resolution *res) HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); if (srv->srvrq == srvrq && srv->svc_port == item->port && item->data_len == srv->hostname_dn_len && - !memcmp(srv->hostname_dn, item->target, item->data_len)) { + !memcmp(srv->hostname_dn, item->target, item->data_len) && + !srv->dns_opts.ignore_weight) { int ha_weight; /* DNS weight range if from 0 to 65535 @@ -589,15 +590,17 @@ static void dns_check_dns_response(struct dns_resolution *res) !(srv->flags & SRV_F_CHECKPORT)) srv->check.port = item->port; - /* DNS weight range if from 0 to 65535 - * HAProxy weight is from 0 to 256 - * 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 + 255) / 256; + if (!srv->dns_opts.ignore_weight) { + /* DNS weight range if from 0 to 65535 + * HAProxy weight is from 0 to 256 + * 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 + 255) / 256; - snprintf(weight, sizeof(weight), "%d", ha_weight); - server_parse_weight_change_request(srv, weight); + snprintf(weight, sizeof(weight), "%d", ha_weight); + server_parse_weight_change_request(srv, weight); + } HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock); } } diff --git a/src/server.c b/src/server.c index 6b740240e..ac7ea37f2 100644 --- a/src/server.c +++ b/src/server.c @@ -1796,6 +1796,7 @@ static void srv_settings_cpy(struct server *srv, struct server *src, int srv_tmp srv->resolvers_id = strdup(src->resolvers_id); srv->dns_opts.family_prio = src->dns_opts.family_prio; srv->dns_opts.accept_duplicate_ip = src->dns_opts.accept_duplicate_ip; + srv->dns_opts.ignore_weight = src->dns_opts.ignore_weight; if (srv->dns_opts.family_prio == AF_UNSPEC) srv->dns_opts.family_prio = AF_INET6; memcpy(srv->dns_opts.pref_net, @@ -2451,11 +2452,14 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr if (!strcmp(p, "allow-dup-ip")) { newsrv->dns_opts.accept_duplicate_ip = 1; } + else if (!strcmp(p, "ignore-weight")) { + newsrv->dns_opts.ignore_weight = 1; + } else if (!strcmp(p, "prevent-dup-ip")) { newsrv->dns_opts.accept_duplicate_ip = 0; } else { - ha_alert("parsing [%s:%d]: '%s' : unknown resolve-opts option '%s', supported methods are 'allow-dup-ip' and 'prevent-dup-ip'.\n", + ha_alert("parsing [%s:%d]: '%s' : unknown resolve-opts option '%s', supported methods are 'allow-dup-ip', 'ignore-weight', and 'prevent-dup-ip'.\n", file, linenum, args[cur_arg], p); err_code |= ERR_ALERT | ERR_FATAL; goto out;