From 610b085c3476f82878a92c9dd604bdaced5e833a Mon Sep 17 00:00:00 2001 From: irfan sharif Date: Thu, 22 Apr 2021 14:47:34 -0400 Subject: [PATCH] metadata: reduce memory footprint in FromOutgoingContext When Looking at memory profiles for cockroachdb/cockroach, we observed that the intermediate metadata.MD array constructed to iterate over appended metadata escaped to the heap. Fortunately, this is easily rectifiable. go build -gcflags '-m' google.golang.org/grpc/metadata ... google.golang.org/grpc/metadata/metadata.go:198:13: make([]MD, 0, len(raw.added) + 1) escapes to heap --- metadata/metadata.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/metadata/metadata.go b/metadata/metadata.go index cf6d1b94781c..d2dbb8518e88 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -195,12 +195,22 @@ func FromOutgoingContext(ctx context.Context) (MD, bool) { return nil, false } - mds := make([]MD, 0, len(raw.added)+1) - mds = append(mds, raw.md) - for _, vv := range raw.added { - mds = append(mds, Pairs(vv...)) + out := raw.md.Copy() + for _, added := range raw.added { + if len(added)%2 == 1 { + panic(fmt.Sprintf("metadata: FromOutgoingContext got the odd number of input pairs for metadata: %d", len(added))) + } + + var key string + for i, s := range added { + if i%2 == 0 { + key = strings.ToLower(s) + continue + } + out[key] = append(out[key], s) + } } - return Join(mds...), ok + return out, ok } type rawMD struct {