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)
| 393 | // |
| 394 | // Modifies ingesters map with updated tokens. |
| 395 | func 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 { |