From 34767c2221686edd4c69c586778137e169fc7284 Mon Sep 17 00:00:00 2001 From: Brian Brazil Date: Wed, 1 Feb 2017 19:49:50 +0000 Subject: [PATCH] Clone lset before relabelling. (#2386) We need to not change the lset passed into populateLabels, as that is kept around by the SDs. Fixes 2377 --- retrieval/target.go | 1 + retrieval/targetmanager_test.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/retrieval/target.go b/retrieval/target.go index ca5cc0db7b..07628c70e7 100644 --- a/retrieval/target.go +++ b/retrieval/target.go @@ -305,6 +305,7 @@ func (app *countingAppender) Append(s *model.Sample) error { // It returns a label set before relabeling was applied as the second return value. // Returns a nil label set if the target is dropped during relabeling. func populateLabels(lset model.LabelSet, cfg *config.ScrapeConfig) (res, orig model.LabelSet, err error) { + lset = lset.Clone() if _, ok := lset[model.AddressLabel]; !ok { return nil, nil, fmt.Errorf("no address") } diff --git a/retrieval/targetmanager_test.go b/retrieval/targetmanager_test.go index dc4568a955..a8b6292047 100644 --- a/retrieval/targetmanager_test.go +++ b/retrieval/targetmanager_test.go @@ -140,10 +140,14 @@ func TestPopulateLabels(t *testing.T) { }, } for i, c := range cases { + in := c.in.Clone() res, orig, err := populateLabels(c.in, c.cfg) if err != nil { t.Fatalf("case %d: %s", i, err) } + if !reflect.DeepEqual(c.in, in) { + t.Errorf("case %d: input lset was changed was\n\t%+v\n now\n\t%+v", i, in, c.in) + } if !reflect.DeepEqual(res, c.res) { t.Errorf("case %d: expected res\n\t%+v\n got\n\t%+v", i, c.res, res) }