From f1455cccce6329c6f799c0144006aa5a1ba895c9 Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Tue, 10 Dec 2024 16:11:19 -0500 Subject: [PATCH] api: don't copy previously parsed URL when setting new address In #16872 we added support for unix domain sockets, but this required mutating the `Config` when parsing the address. In #23785 we fixed a bug where if the configuration was used across multiple clients that mutation would happen multiple times and the address would be incorrectly parsed. When making `alloc log` or `alloc exec` calls to a region where the region is not "global", we create a new client from the same configuration and then set the address. But in this case we copy the private `url` field and that causes the URL parsing to be skipped for the new client. This results in the region always being set to the string literal `global` (because of mTLS handling code introduced all the way back in 4d3b75d867da), which fails with an error "no path to region" when the cluster isn't non-global and requests are sent to a non-leader. The "right" way of fixing this would be for `ClientConfig` not to change the region to global in the first place, but as this is a public API and extremely longstanding behavior, it could potentially be a breaking change for some downstream consumers. Instead, we'll avoid copying the private `url` field so that the new address is re-parsed. Fixes: https://github.com/hashicorp/nomad/issues/24635 Fixes: https://github.com/hashicorp/nomad/issues/24609 Ref: https://github.com/hashicorp/nomad/pull/16872 Ref: https://github.com/hashicorp/nomad/pull/23785 Ref: https://github.com/hashicorp/nomad/commit/4d3b75d867dae508011c198c84318f54b4aa6684 --- api/api.go | 1 - 1 file changed, 1 deletion(-) diff --git a/api/api.go b/api/api.go index 8693167ee4c..07cc4d9f23e 100644 --- a/api/api.go +++ b/api/api.go @@ -234,7 +234,6 @@ func (c *Config) ClientConfig(region, address string, tlsEnabled bool) *Config { HttpAuth: c.HttpAuth, WaitTime: c.WaitTime, TLSConfig: c.TLSConfig.Copy(), - url: copyURL(c.url), } // Update the tls server name for connecting to a client