diff --git a/server/core/store.go b/server/core/store.go index ff77b7f9ac0..f36f1891bb1 100644 --- a/server/core/store.go +++ b/server/core/store.go @@ -562,22 +562,44 @@ func DistinctScore(labels []string, stores []*StoreInfo, other *StoreInfo) float return score } +<<<<<<< HEAD:server/core/store.go // MergeLabels merges the passed in labels with origins, overriding duplicated // ones. func (s *StoreInfo) MergeLabels(labels []*metapb.StoreLabel) []*metapb.StoreLabel { storeLabels := s.GetLabels() L: +======= +// MergeLabels merges the passed in labels with origins, overriding duplicated ones. +// Note: To prevent potential data races, it is advisable to refrain from directly modifying the 'origin' variable. +func MergeLabels(origin []*metapb.StoreLabel, labels []*metapb.StoreLabel) []*metapb.StoreLabel { + results := make([]*metapb.StoreLabel, 0, len(origin)) + for _, label := range origin { + results = append(results, &metapb.StoreLabel{ + Key: label.Key, + Value: label.Value, + }) + } + +>>>>>>> 1772ad02e (core: fix datarace in MergeLabels (#7537)):pkg/core/store.go for _, newLabel := range labels { - for _, label := range storeLabels { + found := false + for _, label := range results { if strings.EqualFold(label.Key, newLabel.Key) { + // Update the value for an existing key. label.Value = newLabel.Value - continue L + found = true + break } } - storeLabels = append(storeLabels, newLabel) + // Add a new label if the key doesn't exist in the original slice. + if !found { + results = append(results, newLabel) + } } - res := storeLabels[:0] - for _, l := range storeLabels { + + // Filter out labels with an empty value. + res := results[:0] + for _, l := range results { if l.Value != "" { res = append(res, l) }