Skip to content

Commit 9014823

Browse files
authored
Using Ingester Id as a tiebreaker for MinimizeSpreadTokenGenerator (#6044)
Signed-off-by: alanprot <[email protected]>
1 parent 79ef088 commit 9014823

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

pkg/ring/token_generator.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,10 @@ func (g *MinimizeSpreadTokenGenerator) GenerateTokens(ring *Desc, id, zone strin
100100
tokensPerInstanceWithDistance[i] = &totalTokenPerInstance{id: i, zone: instance.Zone}
101101

102102
if len(instance.Tokens) == 0 {
103-
// If there is more than one instance with no tokens, lets only use
104-
// MinimizeSpread token algorithm on the last one
105-
if instance.RegisteredTimestamp < ring.Ingesters[id].RegisteredTimestamp {
103+
// If there is more than one ingester with no tokens, use MinimizeSpread only for the first registered ingester.
104+
// In case of a tie, use the ingester ID as a tiebreaker.
105+
if instance.RegisteredTimestamp < ring.Ingesters[id].RegisteredTimestamp ||
106+
(instance.RegisteredTimestamp == ring.Ingesters[id].RegisteredTimestamp && i < id) {
106107
if force {
107108
return g.innerGenerator.GenerateTokens(ring, id, zone, numTokens, true)
108109
} else {

pkg/ring/token_generator_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,16 @@ func TestMinimizeSpreadTokenGenerator(t *testing.T) {
122122
require.Len(t, tokens, 0)
123123
tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false)
124124
require.Len(t, tokens, 512)
125+
126+
// Should generate tokens only for the ingesters with the smaller Id when multiples ingesters does not have tokens
127+
// and have the same registered time
128+
now := time.Now()
129+
rindDesc.AddIngester("pendingIngester-1", "pendingIngester-1", zones[0], []uint32{}, PENDING, now)
130+
rindDesc.AddIngester("pendingIngester-2", "pendingIngester-2", zones[0], []uint32{}, PENDING, now)
131+
tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1", zones[0], 512, false)
132+
require.Len(t, tokens, 512)
133+
tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false)
134+
require.Len(t, tokens, 0)
125135
}
126136

127137
func generateTokensForIngesters(t *testing.T, rindDesc *Desc, prefix string, zones []string, minimizeTokenGenerator *MinimizeSpreadTokenGenerator, dups map[uint32]bool) {

0 commit comments

Comments
 (0)