diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b6738da1..5f4d2093e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ * [ENHANCEMENT] Replace go-kit/kit/log with go-kit/log. #52 * [ENHANCEMENT] Add spanlogger package. #42 * [ENHANCEMENT] Add runutil.CloseWithLogOnErr function. #58 -* [ENHANCEMENT] Optimise memberlist receive path when used as a backing store for rings with a large number of members. #76 #77 +* [ENHANCEMENT] Optimise memberlist receive path when used as a backing store for rings with a large number of members. #76 #77 #84 * [ENHANCEMENT] Memberlist: prepare the data to send on the write before starting counting the elapsed time for `-memberlist.packet-write-timeout`, in order to reduce chances we hit the timeout when sending a packet to other node. #89 * [BUGFIX] spanlogger: Support multiple tenant IDs. #59 * [BUGFIX] Memberlist: fixed corrupted packets when sending compound messages with more than 255 messages or messages bigger than 64KB. #85 diff --git a/ring/model.go b/ring/model.go index ca5e85ff4..b8ad22281 100644 --- a/ring/model.go +++ b/ring/model.go @@ -4,6 +4,7 @@ import ( "container/heap" "fmt" "sort" + "sync" "time" "github.com/gogo/protobuf/proto" @@ -302,19 +303,22 @@ func normalizeIngestersMap(inputRing *Desc) { } } -func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { - count := 0 - for _, ing := range normalizedIngesters { - count += len(ing.Tokens) - } +var tokenMapPool = sync.Pool{New: func() interface{} { return make(map[uint32]struct{}) }} - tokensMap := make(map[uint32]bool, count) +func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { + tokensMap := tokenMapPool.Get().(map[uint32]struct{}) + defer func() { + for k := range tokensMap { + delete(tokensMap, k) + } + tokenMapPool.Put(tokensMap) + }() for _, ing := range normalizedIngesters { for _, t := range ing.Tokens { - if tokensMap[t] { + if _, contains := tokensMap[t]; contains { return true } - tokensMap[t] = true + tokensMap[t] = struct{}{} } } return false