From 5b605430adc9e0aa1d7cbfcbd93a244ec30270e9 Mon Sep 17 00:00:00 2001 From: Tyler Reid Date: Tue, 30 Nov 2021 15:52:09 -0600 Subject: [PATCH 1/5] Add sync.pool to contain our token map in conflictingTokensExist --- ring/model.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ring/model.go b/ring/model.go index ca5e85ff4..115b351a8 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,13 +303,17 @@ func normalizeIngestersMap(inputRing *Desc) { } } +var tokenMapPool = sync.Pool{New: func() interface{}{return make(map[uint32]bool)}} + func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { count := 0 for _, ing := range normalizedIngesters { count += len(ing.Tokens) } - - tokensMap := make(map[uint32]bool, count) + tokensMap := tokenMapPool.Get().(map[uint32]bool) + defer func() { + tokenMapPool.Put(tokensMap) + }() for _, ing := range normalizedIngesters { for _, t := range ing.Tokens { if tokensMap[t] { From 378a23e134412c73acbcb91c6f7825b5d29befaf Mon Sep 17 00:00:00 2001 From: Tyler Reid Date: Tue, 30 Nov 2021 16:34:17 -0600 Subject: [PATCH 2/5] Update to delete entries in the map then put to the pool --- ring/model.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ring/model.go b/ring/model.go index 115b351a8..7a2be6f22 100644 --- a/ring/model.go +++ b/ring/model.go @@ -303,7 +303,7 @@ func normalizeIngestersMap(inputRing *Desc) { } } -var tokenMapPool = sync.Pool{New: func() interface{}{return make(map[uint32]bool)}} +var tokenMapPool = sync.Pool{New: func() interface{} { return make(map[uint32]bool) }} func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { count := 0 @@ -312,6 +312,9 @@ func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { } tokensMap := tokenMapPool.Get().(map[uint32]bool) defer func() { + for k := range tokensMap { + delete(tokensMap, k) + } tokenMapPool.Put(tokensMap) }() for _, ing := range normalizedIngesters { From 9be7e0d7fdd508fbb64e823ca4d4c7165263e930 Mon Sep 17 00:00:00 2001 From: Tyler Reid Date: Tue, 30 Nov 2021 17:29:53 -0600 Subject: [PATCH 3/5] remove un-used count --- ring/model.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ring/model.go b/ring/model.go index 7a2be6f22..c16b0d1d1 100644 --- a/ring/model.go +++ b/ring/model.go @@ -306,10 +306,6 @@ func normalizeIngestersMap(inputRing *Desc) { var tokenMapPool = sync.Pool{New: func() interface{} { return make(map[uint32]bool) }} func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { - count := 0 - for _, ing := range normalizedIngesters { - count += len(ing.Tokens) - } tokensMap := tokenMapPool.Get().(map[uint32]bool) defer func() { for k := range tokensMap { From 72097b54f2fb73c6cacaf9c8112891fcaff38f69 Mon Sep 17 00:00:00 2001 From: Tyler Reid Date: Tue, 30 Nov 2021 17:35:16 -0600 Subject: [PATCH 4/5] Switch to using a map[unit32]struct{} instead of a map[uint32]bool since we use the boolean as pretty much just a contains check. --- ring/model.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ring/model.go b/ring/model.go index c16b0d1d1..b8ad22281 100644 --- a/ring/model.go +++ b/ring/model.go @@ -303,10 +303,10 @@ func normalizeIngestersMap(inputRing *Desc) { } } -var tokenMapPool = sync.Pool{New: func() interface{} { return make(map[uint32]bool) }} +var tokenMapPool = sync.Pool{New: func() interface{} { return make(map[uint32]struct{}) }} func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { - tokensMap := tokenMapPool.Get().(map[uint32]bool) + tokensMap := tokenMapPool.Get().(map[uint32]struct{}) defer func() { for k := range tokensMap { delete(tokensMap, k) @@ -315,10 +315,10 @@ func conflictingTokensExist(normalizedIngesters map[string]InstanceDesc) bool { }() 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 From d5895afcf43c82f5917e3cfe0e351ef3a8e2ced4 Mon Sep 17 00:00:00 2001 From: Steve Simpson Date: Wed, 1 Dec 2021 13:01:21 +0100 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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