From dbffe22465e800df27d1d37b037a374cadb7c36c Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Fri, 26 Aug 2022 16:05:12 -0700 Subject: [PATCH] consul: allow stale namespace results (#12953) Nomad reconciles services it expects to be registered in Consul with what is actually registered in the local Consul agent. This is necessary to prevent leaking service registrations if Nomad crashes at certain points (or if there are bugs). When Consul has namespaces enabled, we must iterate over each available namespace to be sure no services were leaked into non-default namespaces. Since this reconciliation happens often, there's no need to require results from the Consul leader server. In large clusters this creates far more load than the "freshness" of the response is worth. Therefore this patch switches the request to AllowStale=true --- .changelog/12953.txt | 3 +++ command/agent/consul/namespaces_client.go | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .changelog/12953.txt diff --git a/.changelog/12953.txt b/.changelog/12953.txt new file mode 100644 index 000000000..82ed92b50 --- /dev/null +++ b/.changelog/12953.txt @@ -0,0 +1,3 @@ +```release-note:improvement +consul: Reduce load on Consul leader server by allowing stale results when listing namespaces. +``` diff --git a/command/agent/consul/namespaces_client.go b/command/agent/consul/namespaces_client.go index c2d8b082b..7f7961bd2 100644 --- a/command/agent/consul/namespaces_client.go +++ b/command/agent/consul/namespaces_client.go @@ -4,6 +4,8 @@ import ( "sort" "sync" "time" + + "github.com/hashicorp/consul/api" ) const ( @@ -66,8 +68,6 @@ func (ns *NamespacesClient) allowable(now time.Time) bool { } // List returns a list of Consul Namespaces. -// -// TODO(shoenig): return empty string instead of "default" when namespaces are not enabled. (Coming in followup PR). func (ns *NamespacesClient) List() ([]string, error) { if !ns.allowable(time.Now()) { // TODO(shoenig): lets return the empty string instead, that way we do not @@ -75,7 +75,10 @@ func (ns *NamespacesClient) List() ([]string, error) { return []string{"default"}, nil } - namespaces, _, err := ns.namespacesAPI.List(nil) + qo := &api.QueryOptions{ + AllowStale: true, + } + namespaces, _, err := ns.namespacesAPI.List(qo) if err != nil { return nil, err }