From 6552b906571b32c182f951d9fec77317a27c4316 Mon Sep 17 00:00:00 2001 From: Justin SB Date: Tue, 7 Sep 2021 13:54:55 -0400 Subject: [PATCH] Cache the OrgId for nameReferenceTransformer Because this is in an inner loop and is fairly memory-allocation expensive even on a single allocation, it comes up top-of-the-list in memory allocation pprof profiles, for example with the coredns ClusterAddon. Add simple caching. --- api/internal/accumulator/namereferencetransformer.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/api/internal/accumulator/namereferencetransformer.go b/api/internal/accumulator/namereferencetransformer.go index a94ebcdf00..1ed75e9df0 100644 --- a/api/internal/accumulator/namereferencetransformer.go +++ b/api/internal/accumulator/namereferencetransformer.go @@ -11,6 +11,7 @@ import ( "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/kyaml/resid" ) type nameReferenceTransformer struct { @@ -109,11 +110,18 @@ func debug(fMap filterMap) { // 'spec/scaleTargetRef/name' field. Return a filter that can do that. func (t *nameReferenceTransformer) determineFilters( resources []*resource.Resource) (fMap filterMap) { + + // We cache the resource OrgId values because they don't change and otherwise are very visible in a memory pprof + resourceOrgIds := make([]resid.ResId, len(resources)) + for i, resource := range resources { + resourceOrgIds[i] = resource.OrgId() + } + fMap = make(filterMap) for _, backReference := range t.backRefs { for _, referrerSpec := range backReference.Referrers { - for _, res := range resources { - if res.OrgId().IsSelected(&referrerSpec.Gvk) { + for i, res := range resources { + if resourceOrgIds[i].IsSelected(&referrerSpec.Gvk) { // If this is true, the res might be a referrer, and if // so, the name reference it holds might need an update. if resHasField(res, referrerSpec.Path) {