From e560b5ecc10302b6a3539be57f4f16ad9fd24f63 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" Date: Fri, 31 Jan 2025 22:12:30 +0000 Subject: [PATCH 1/4] backport of commit fcf694d32e63e2478842f70e84fceec671220e84 --- agent/metadata/build.go | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/agent/metadata/build.go b/agent/metadata/build.go index 76a432d9a38..b42beae32f8 100644 --- a/agent/metadata/build.go +++ b/agent/metadata/build.go @@ -4,12 +4,51 @@ package metadata import ( + "sync" + "github.com/hashicorp/go-version" "github.com/hashicorp/serf/serf" ) +type versionTuple struct { + Value *version.Version + Err error +} + +var versionCache sync.Map // string->versionTuple + // Build extracts the Consul version info for a member. func Build(m *serf.Member) (*version.Version, error) { - str := versionFormat.FindString(m.Tags["build"]) + build := m.Tags["build"] + + ok, v, err := getMemoizedBuildVersion(build) + if ok { + return v, err + } + + v, err = parseBuildAsVersion(build) + + versionCache.Store(build, versionTuple{Value: v, Err: err}) + + return v, err +} + +func getMemoizedBuildVersion(build string) (bool, *version.Version, error) { + rawTuple, ok := versionCache.Load(build) + if !ok { + return false, nil, nil + } + tuple, ok := rawTuple.(versionTuple) + if !ok { + return false, nil, nil + } + if tuple.Err != nil { + return true, nil, tuple.Err + } + return true, tuple.Value, nil +} + +func parseBuildAsVersion(build string) (*version.Version, error) { + str := versionFormat.FindString(build) return version.NewVersion(str) } From ede956c22d11cef42c96f9dee3c988aaea378c47 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" Date: Fri, 31 Jan 2025 22:31:07 +0000 Subject: [PATCH 2/4] backport of commit ba856addf7f37ca9777cb7361e0258dbb91bf2ac --- .changelog/22113.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/22113.txt diff --git a/.changelog/22113.txt b/.changelog/22113.txt new file mode 100644 index 00000000000..c97fff1a4a3 --- /dev/null +++ b/.changelog/22113.txt @@ -0,0 +1,3 @@ +```release-note:improvement +metadata: memoize the parsed build versions +``` From e3e6b0032389b48d3a27f1139130261378358c89 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" <4903+rboyer@users.noreply.github.com> Date: Fri, 31 Jan 2025 22:32:07 +0000 Subject: [PATCH 3/4] backport of commit 1f21f81e83f0c72d7e22b1c3e12c05e2c4474859 --- agent/metadata/build.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/agent/metadata/build.go b/agent/metadata/build.go index b42beae32f8..880132b9db0 100644 --- a/agent/metadata/build.go +++ b/agent/metadata/build.go @@ -42,10 +42,7 @@ func getMemoizedBuildVersion(build string) (bool, *version.Version, error) { if !ok { return false, nil, nil } - if tuple.Err != nil { - return true, nil, tuple.Err - } - return true, tuple.Value, nil + return true, tuple.Value, tuple.Err } func parseBuildAsVersion(build string) (*version.Version, error) { From 561d2cc4927c5d78af3cd3094a160213fb2cddb4 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" Date: Fri, 31 Jan 2025 22:37:19 +0000 Subject: [PATCH 4/4] backport of commit 760167dc426345be6ed94e4a0568f78f3564eb7b --- agent/metadata/server.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/agent/metadata/server.go b/agent/metadata/server.go index 2e626787bdf..19dba6e2cc9 100644 --- a/agent/metadata/server.go +++ b/agent/metadata/server.go @@ -127,11 +127,6 @@ func IsConsulServer(m serf.Member) (bool, *Server) { } } - buildVersion, err := Build(&m) - if err != nil { - return false, nil - } - wanJoinPort := 0 wanJoinPortStr, ok := m.Tags["wan_join_port"] if ok { @@ -180,6 +175,11 @@ func IsConsulServer(m serf.Member) (bool, *Server) { addr := &net.TCPAddr{IP: m.Addr, Port: port} + buildVersion, err := Build(&m) + if err != nil { + return false, nil + } + parts := &Server{ Name: m.Name, ShortName: strings.TrimSuffix(m.Name, "."+datacenter),