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

Function resolveConflicts

pkg/ring/model.go:395–457  ·  view source on GitHub ↗

This function resolves token conflicts, if there are any. We deal with two possibilities: 1) if one node is LEAVING or LEFT and the other node is not, LEVING/LEFT one loses the token 2) otherwise node names are compared, and node with "lower" name wins the token Modifies ingesters map with updated

(normalizedIngesters map[string]InstanceDesc)

Source from the content-addressed store, hash-verified

393//
394// Modifies ingesters map with updated tokens.
395func resolveConflicts(normalizedIngesters map[string]InstanceDesc) {
396 size := 0
397 for _, ing := range normalizedIngesters {
398 size += len(ing.Tokens)
399 }
400 tokens := make([]uint32, 0, size)
401 tokenToIngester := make(map[uint32]string, size)
402
403 for ingKey, ing := range normalizedIngesters {
404 if ing.State == LEFT {
405 // LEFT ingesters don't use tokens anymore
406 continue
407 }
408
409 for _, token := range ing.Tokens {
410 prevKey, found := tokenToIngester[token]
411 if !found {
412 tokens = append(tokens, token)
413 tokenToIngester[token] = ingKey
414 } else {
415 // there is already ingester for this token, let's do conflict resolution
416 prevIng := normalizedIngesters[prevKey]
417
418 winnerKey := ingKey
419 switch {
420 case ing.State == LEAVING && prevIng.State != LEAVING:
421 winnerKey = prevKey
422 case prevIng.State == LEAVING && ing.State != LEAVING:
423 winnerKey = ingKey
424 case ingKey < prevKey:
425 winnerKey = ingKey
426 case prevKey < ingKey:
427 winnerKey = prevKey
428 }
429
430 tokenToIngester[token] = winnerKey
431 }
432 }
433 }
434
435 sort.Sort(Tokens(tokens))
436
437 // let's store the resolved result back
438 newTokenLists := map[string][]uint32{}
439 for key := range normalizedIngesters {
440 // make sure that all ingesters start with empty list
441 // especially ones that will no longer have any tokens
442 newTokenLists[key] = nil
443 }
444
445 // build list of tokens for each ingester
446 for _, token := range tokens {
447 key := tokenToIngester[token]
448 newTokenLists[key] = append(newTokenLists[key], token)
449 }
450
451 // write tokens back
452 for key, tokens := range newTokenLists {

Callers 3

mergeWithTimeMethod · 0.85
FindDifferenceMethod · 0.85
Test_resolveConflictsFunction · 0.85

Calls 1

TokensTypeAlias · 0.85

Tested by 1

Test_resolveConflictsFunction · 0.68