From 6cec5ce5ab092529ce551c187034f3cf9cc0433b Mon Sep 17 00:00:00 2001 From: Lincoln Stoll Date: Mon, 27 Feb 2023 13:35:39 +0000 Subject: [PATCH 1/2] backport of commit 04b6a909341b591678cc832b73dc19fd083134b9 --- GNUmakefile | 1 + agent/consul/state/catalog.go | 19 ++----------------- agent/consul/state/catalog_schema.deepcopy.go | 15 +++++++++++++++ agent/consul/state/deep-copy.sh | 11 +++++++++++ 4 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 agent/consul/state/catalog_schema.deepcopy.go create mode 100755 agent/consul/state/deep-copy.sh diff --git a/GNUmakefile b/GNUmakefile index 4e356a0f57b..7c65b7808bb 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -369,6 +369,7 @@ codegen-tools: deep-copy: codegen-tools @$(SHELL) $(CURDIR)/agent/structs/deep-copy.sh @$(SHELL) $(CURDIR)/agent/proxycfg/deep-copy.sh + @$(SHELL) $(CURDIR)/agent/consul/state/deep-copy.sh version: @echo -n "Version: " diff --git a/agent/consul/state/catalog.go b/agent/consul/state/catalog.go index 077fbde79a8..003bf409f4e 100644 --- a/agent/consul/state/catalog.go +++ b/agent/consul/state/catalog.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/hashicorp/go-memdb" - "github.com/mitchellh/copystructure" "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/configentry" @@ -4564,14 +4563,7 @@ func updateMeshTopology(tx WriteTxn, idx uint64, node string, svc *structs.NodeS var mapping *upstreamDownstream if existing, ok := obj.(*upstreamDownstream); ok { - rawCopy, err := copystructure.Copy(existing) - if err != nil { - return fmt.Errorf("failed to copy existing topology mapping: %v", err) - } - mapping, ok = rawCopy.(*upstreamDownstream) - if !ok { - return fmt.Errorf("unexpected topology type %T", rawCopy) - } + mapping := existing.DeepCopy() mapping.Refs[uid] = struct{}{} mapping.ModifyIndex = idx @@ -4637,14 +4629,7 @@ func cleanupMeshTopology(tx WriteTxn, idx uint64, service *structs.ServiceNode) // Do the updates in a separate loop so we don't trash the iterator. for _, m := range mappings { - rawCopy, err := copystructure.Copy(m) - if err != nil { - return fmt.Errorf("failed to copy existing topology mapping: %v", err) - } - copy, ok := rawCopy.(*upstreamDownstream) - if !ok { - return fmt.Errorf("unexpected topology type %T", rawCopy) - } + copy := m.DeepCopy() // Bail early if there's no reference to the proxy ID we're deleting if _, ok := copy.Refs[uid]; !ok { diff --git a/agent/consul/state/catalog_schema.deepcopy.go b/agent/consul/state/catalog_schema.deepcopy.go new file mode 100644 index 00000000000..406a7fdce79 --- /dev/null +++ b/agent/consul/state/catalog_schema.deepcopy.go @@ -0,0 +1,15 @@ +// generated by deep-copy -pointer-receiver -o ./catalog_schema.deepcopy.go -type upstreamDownstream ./; DO NOT EDIT. + +package state + +// DeepCopy generates a deep copy of *upstreamDownstream +func (o *upstreamDownstream) DeepCopy() *upstreamDownstream { + var cp upstreamDownstream = *o + if o.Refs != nil { + cp.Refs = make(map[string]struct{}, len(o.Refs)) + for k2, v2 := range o.Refs { + cp.Refs[k2] = v2 + } + } + return &cp +} diff --git a/agent/consul/state/deep-copy.sh b/agent/consul/state/deep-copy.sh new file mode 100755 index 00000000000..d976d921f3c --- /dev/null +++ b/agent/consul/state/deep-copy.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +readonly PACKAGE_DIR="$(dirname "${BASH_SOURCE[0]}")" +cd $PACKAGE_DIR + +# Uses: https://github.com/globusdigital/deep-copy +deep-copy \ + -pointer-receiver \ + -o ./catalog_schema.deepcopy.go \ + -type upstreamDownstream \ + ./ From e733fa0d063e8a6cfdf06eb48e71a0c368d582f3 Mon Sep 17 00:00:00 2001 From: John Murret Date: Fri, 26 May 2023 17:28:23 +0000 Subject: [PATCH 2/2] backport of commit 13e40572bd0eac557ceb97e3dfb15fb906c43360 --- .changelog/16552.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/16552.txt diff --git a/.changelog/16552.txt b/.changelog/16552.txt new file mode 100644 index 00000000000..40633be1730 --- /dev/null +++ b/.changelog/16552.txt @@ -0,0 +1,3 @@ +```release-note:improvement +raft: Remove expensive reflection from raft/mesh hot path +```