MCPcopy
hub / github.com/grafana/dskit / resolveConflicts

Function resolveConflicts

ring/model.go:392–454  ·  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

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

Callers 1

mergeWithTimeMethod · 0.85

Calls 1

TokensTypeAlias · 0.85

Tested by

no test coverage detected