MCPcopy Create free account
hub / github.com/cortexproject/cortex / TestMinimizeSpreadTokenGenerator

Function TestMinimizeSpreadTokenGenerator

pkg/ring/token_generator_test.go:78–145  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

76}
77
78func TestMinimizeSpreadTokenGenerator(t *testing.T) {
79 rindDesc := NewDesc()
80 zones := []string{"zone1", "zone2", "zone3"}
81
82 mTokenGenerator := newMockedTokenGenerator(len(zones))
83 minimizeTokenGenerator := &MinimizeSpreadTokenGenerator{
84 innerGenerator: mTokenGenerator,
85 }
86
87 dups := map[uint32]bool{}
88
89 // First time we should generate tokens using the inner generator
90 generateTokensForIngesters(t, rindDesc, "initial", zones, minimizeTokenGenerator, dups)
91 require.Equal(t, mTokenGenerator.called, len(zones))
92
93 // Should Generate tokens based on the ring state
94 for i := range 50 {
95 generateTokensForIngesters(t, rindDesc, fmt.Sprintf("minimize-%v", i), zones, minimizeTokenGenerator, dups)
96 assertDistancePerIngester(t, rindDesc, 0.01)
97 }
98 require.Equal(t, mTokenGenerator.called, len(zones))
99
100 // Test generating tokens for an ingester that already have tokens in the ring
101 rg := NewRandomTokenGenerator()
102 rTokens := rg.GenerateTokens(rindDesc, "partial", zones[0], 256, true)
103 rindDesc.AddIngester("partial", "partial", zones[0], rTokens, ACTIVE, time.Now())
104 nTokens := minimizeTokenGenerator.GenerateTokens(rindDesc, "partial", zones[0], 256, true)
105 rindDesc.AddIngester("partial", "partial", zones[0], append(rTokens, nTokens...), ACTIVE, time.Now())
106 assertDistancePerIngester(t, rindDesc, 0.01)
107
108 mTokenGenerator.called = 0
109 // Should fallback to random generator when more than 1 ingester does not have tokens and force flag is set
110 rindDesc.AddIngester("pendingIngester-1", "pendingIngester-1", zones[0], []uint32{}, PENDING, time.Now())
111 rindDesc.AddIngester("pendingIngester-2", "pendingIngester-2", zones[0], []uint32{}, PENDING, time.Now().Add(-10*time.Minute))
112 tokens := minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1", zones[0], 512, true)
113 require.Len(t, tokens, 512)
114 require.Equal(t, mTokenGenerator.called, 1)
115
116 // Should generate for the ingester with with the smaller registered
117 tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false)
118 require.Len(t, tokens, 512)
119 require.Equal(t, mTokenGenerator.called, 1)
120
121 // Should generate tokens on other AZs
122 rindDesc.AddIngester("pendingIngester-1-az-2", "pendingIngester-1-az-2", zones[0], []uint32{}, PENDING, time.Now())
123 tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1-az-2", zones[1], 512, false)
124 require.Len(t, tokens, 512)
125 require.Equal(t, mTokenGenerator.called, 1)
126 // Lets remove this pending ingester to no interfere with the next tests
127 rindDesc.RemoveIngester("pendingIngester-1-az-2")
128
129 // Should generate tokens only for the ingesters with the smaller registered time when multiples
130 // ingesters does not have tokens
131 tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1", zones[0], 512, false)
132 require.Len(t, tokens, 0)
133 tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false)
134 require.Len(t, tokens, 512)
135

Callers

nothing calls this directly

Calls 12

GenerateTokensMethod · 0.95
AddIngesterMethod · 0.95
GenerateTokensMethod · 0.95
RemoveIngesterMethod · 0.95
NewDescFunction · 0.85
newMockedTokenGeneratorFunction · 0.85
NewRandomTokenGeneratorFunction · 0.85
EqualMethod · 0.65
AddMethod · 0.45
LenMethod · 0.45

Tested by

no test coverage detected