Skip to content

Commit 42f0afd

Browse files
committed
Solved all TODOs
Signed-off-by: Marco Pracucci <[email protected]>
1 parent 339744e commit 42f0afd

File tree

4 files changed

+65
-33
lines changed

4 files changed

+65
-33
lines changed

pkg/ring/model.go

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,11 @@ type TokenDesc struct {
397397

398398
// getTokens returns sorted list of tokens with ingester IDs, owned by each ingester in the ring.
399399
func (d *Desc) getTokens() []TokenDesc {
400-
tokens := make([]TokenDesc, 0, d.getTokensCountEstimation())
400+
numTokens := 0
401+
for _, ing := range d.Ingesters {
402+
numTokens += len(ing.Tokens)
403+
}
404+
tokens := make([]TokenDesc, 0, numTokens)
401405
for key, ing := range d.Ingesters {
402406
for _, token := range ing.Tokens {
403407
tokens = append(tokens, TokenDesc{Token: token, Ingester: key, Zone: ing.GetZone()})
@@ -408,13 +412,12 @@ func (d *Desc) getTokens() []TokenDesc {
408412
return tokens
409413
}
410414

411-
// TODO comment
412-
// TODO test me
415+
// getTokensByZone returns instances tokens grouped by zone. Tokens within each zone
416+
// are guaranteed to be sorted.
413417
func (d *Desc) getTokensByZone() map[string][]TokenDesc {
414418
zones := map[string][]TokenDesc{}
415419

416420
for key, ing := range d.Ingesters {
417-
// TODO initialize zones[ing.Zone] with a slice allocated for getTokensCountEstimation() ?
418421
for _, token := range ing.Tokens {
419422
zones[ing.Zone] = append(zones[ing.Zone], TokenDesc{Token: token, Ingester: key, Zone: ing.GetZone()})
420423
}
@@ -428,17 +431,6 @@ func (d *Desc) getTokensByZone() map[string][]TokenDesc {
428431
return zones
429432
}
430433

431-
// getTokensCountEstimation returns a quick estimation of the number of tokens
432-
// across all instances in the ring, assuming each instance has the same number
433-
// of tokens.
434-
func (d *Desc) getTokensCountEstimation() int {
435-
for _, ing := range d.Ingesters {
436-
return len(ing.Tokens) * len(d.Ingesters)
437-
}
438-
439-
return 0
440-
}
441-
442434
func GetOrCreateRingDesc(d interface{}) *Desc {
443435
if d == nil {
444436
return NewDesc()

pkg/ring/model_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,57 @@ func TestDesc_Ready(t *testing.T) {
186186
t.Fatal("expected ready, got", err)
187187
}
188188
}
189+
190+
func TestDesc_getTokensByZone(t *testing.T) {
191+
tests := map[string]struct {
192+
desc *Desc
193+
expected map[string][]TokenDesc
194+
}{
195+
"empty ring": {
196+
desc: &Desc{Ingesters: map[string]IngesterDesc{}},
197+
expected: map[string][]TokenDesc{},
198+
},
199+
"single zone": {
200+
desc: &Desc{Ingesters: map[string]IngesterDesc{
201+
"instance-1": {Addr: "127.0.0.1", Tokens: []uint32{1, 5}, Zone: ""},
202+
"instance-2": {Addr: "127.0.0.1", Tokens: []uint32{2, 4}, Zone: ""},
203+
"instance-3": {Addr: "127.0.0.1", Tokens: []uint32{3, 6}, Zone: ""},
204+
}},
205+
expected: map[string][]TokenDesc{
206+
"": {
207+
{Token: 1, Ingester: "instance-1", Zone: ""},
208+
{Token: 2, Ingester: "instance-2", Zone: ""},
209+
{Token: 3, Ingester: "instance-3", Zone: ""},
210+
{Token: 4, Ingester: "instance-2", Zone: ""},
211+
{Token: 5, Ingester: "instance-1", Zone: ""},
212+
{Token: 6, Ingester: "instance-3", Zone: ""},
213+
},
214+
},
215+
},
216+
"multiple zones": {
217+
desc: &Desc{Ingesters: map[string]IngesterDesc{
218+
"instance-1": {Addr: "127.0.0.1", Tokens: []uint32{1, 5}, Zone: "zone-1"},
219+
"instance-2": {Addr: "127.0.0.1", Tokens: []uint32{2, 4}, Zone: "zone-1"},
220+
"instance-3": {Addr: "127.0.0.1", Tokens: []uint32{3, 6}, Zone: "zone-2"},
221+
}},
222+
expected: map[string][]TokenDesc{
223+
"zone-1": {
224+
{Token: 1, Ingester: "instance-1", Zone: "zone-1"},
225+
{Token: 2, Ingester: "instance-2", Zone: "zone-1"},
226+
{Token: 4, Ingester: "instance-2", Zone: "zone-1"},
227+
{Token: 5, Ingester: "instance-1", Zone: "zone-1"},
228+
},
229+
"zone-2": {
230+
{Token: 3, Ingester: "instance-3", Zone: "zone-2"},
231+
{Token: 6, Ingester: "instance-3", Zone: "zone-2"},
232+
},
233+
},
234+
},
235+
}
236+
237+
for testName, testData := range tests {
238+
t.Run(testName, func(t *testing.T) {
239+
assert.Equal(t, testData.expected, testData.desc.getTokensByZone())
240+
})
241+
}
242+
}

pkg/ring/ring_test.go

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -248,21 +248,8 @@ func TestRing_ShuffleShard_Stability(t *testing.T) {
248248
shardSizes = []int{3, 6, 9, 12, 15}
249249
)
250250

251-
// Initialise the ring instances.
252-
instances := make(map[string]IngesterDesc, numInstances)
253-
for i := 1; i <= numInstances; i++ {
254-
id := fmt.Sprintf("instance-%d", i)
255-
instances[id] = IngesterDesc{
256-
Addr: fmt.Sprintf("127.0.0.%d", i),
257-
Timestamp: time.Now().Unix(),
258-
State: ACTIVE,
259-
Tokens: GenerateTokens(128, nil),
260-
Zone: fmt.Sprintf("zone-%d", i%numZones),
261-
}
262-
}
263-
264251
// Initialise the ring.
265-
ringDesc := &Desc{Ingesters: instances}
252+
ringDesc := &Desc{Ingesters: generateRingInstances(numInstances, numZones)}
266253
ring := Ring{
267254
cfg: Config{HeartbeatTimeout: time.Hour},
268255
ringDesc: ringDesc,
@@ -706,7 +693,6 @@ func generateTokensLinear(instanceID, numInstances, numTokens int) []uint32 {
706693
return tokens
707694
}
708695

709-
// TODO use across the tests
710696
func generateRingInstances(numInstances, numZones int) map[string]IngesterDesc {
711697
instances := make(map[string]IngesterDesc, numInstances)
712698

@@ -729,7 +715,6 @@ func generateRingInstance(id, zone int) (string, IngesterDesc) {
729715
}
730716

731717
// compareReplicationSets returns the list of instance addresses which differ between the two sets.
732-
// TODO check if can be used to simplify other tests
733718
func compareReplicationSets(first, second ReplicationSet) (added, removed []string) {
734719
for _, instance := range first.Ingesters {
735720
if !second.Includes(instance.Addr) {

pkg/ring/util.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ func WaitInstanceState(ctx context.Context, r *Ring, instanceID string, state In
8282
return backoff.Err()
8383
}
8484

85-
// TODO comment (guarantee sorting)
85+
// getZones return the list zones from the provided tokens. The returned list
86+
// is guaranteed to be sorted.
8687
func getZones(tokens map[string][]TokenDesc) []string {
8788
var zones []string
8889

@@ -94,7 +95,7 @@ func getZones(tokens map[string][]TokenDesc) []string {
9495
return zones
9596
}
9697

97-
// TODO comment
98+
// searchToken returns the offset of the tokens entry holding the range for the provided key.
9899
func searchToken(tokens []TokenDesc, key uint32) int {
99100
i := sort.Search(len(tokens), func(x int) bool {
100101
return tokens[x].Token > key

0 commit comments

Comments
 (0)