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)
| 390 | // |
| 391 | // Modifies ingesters map with updated tokens. |
| 392 | func 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 { |
no test coverage detected