(t *testing.T)
| 76 | } |
| 77 | |
| 78 | func TestMinimizeSpreadTokenGenerator(t *testing.T) { |
| 79 | rindDesc := NewDesc() |
| 80 | zones := []string{"zone1", "zone2", "zone3"} |
| 81 | |
| 82 | mTokenGenerator := newMockedTokenGenerator(len(zones)) |
| 83 | minimizeTokenGenerator := &MinimizeSpreadTokenGenerator{ |
| 84 | innerGenerator: mTokenGenerator, |
| 85 | } |
| 86 | |
| 87 | dups := map[uint32]bool{} |
| 88 | |
| 89 | // First time we should generate tokens using the inner generator |
| 90 | generateTokensForIngesters(t, rindDesc, "initial", zones, minimizeTokenGenerator, dups) |
| 91 | require.Equal(t, mTokenGenerator.called, len(zones)) |
| 92 | |
| 93 | // Should Generate tokens based on the ring state |
| 94 | for i := range 50 { |
| 95 | generateTokensForIngesters(t, rindDesc, fmt.Sprintf("minimize-%v", i), zones, minimizeTokenGenerator, dups) |
| 96 | assertDistancePerIngester(t, rindDesc, 0.01) |
| 97 | } |
| 98 | require.Equal(t, mTokenGenerator.called, len(zones)) |
| 99 | |
| 100 | // Test generating tokens for an ingester that already have tokens in the ring |
| 101 | rg := NewRandomTokenGenerator() |
| 102 | rTokens := rg.GenerateTokens(rindDesc, "partial", zones[0], 256, true) |
| 103 | rindDesc.AddIngester("partial", "partial", zones[0], rTokens, ACTIVE, time.Now()) |
| 104 | nTokens := minimizeTokenGenerator.GenerateTokens(rindDesc, "partial", zones[0], 256, true) |
| 105 | rindDesc.AddIngester("partial", "partial", zones[0], append(rTokens, nTokens...), ACTIVE, time.Now()) |
| 106 | assertDistancePerIngester(t, rindDesc, 0.01) |
| 107 | |
| 108 | mTokenGenerator.called = 0 |
| 109 | // Should fallback to random generator when more than 1 ingester does not have tokens and force flag is set |
| 110 | rindDesc.AddIngester("pendingIngester-1", "pendingIngester-1", zones[0], []uint32{}, PENDING, time.Now()) |
| 111 | rindDesc.AddIngester("pendingIngester-2", "pendingIngester-2", zones[0], []uint32{}, PENDING, time.Now().Add(-10*time.Minute)) |
| 112 | tokens := minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1", zones[0], 512, true) |
| 113 | require.Len(t, tokens, 512) |
| 114 | require.Equal(t, mTokenGenerator.called, 1) |
| 115 | |
| 116 | // Should generate for the ingester with with the smaller registered |
| 117 | tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false) |
| 118 | require.Len(t, tokens, 512) |
| 119 | require.Equal(t, mTokenGenerator.called, 1) |
| 120 | |
| 121 | // Should generate tokens on other AZs |
| 122 | rindDesc.AddIngester("pendingIngester-1-az-2", "pendingIngester-1-az-2", zones[0], []uint32{}, PENDING, time.Now()) |
| 123 | tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1-az-2", zones[1], 512, false) |
| 124 | require.Len(t, tokens, 512) |
| 125 | require.Equal(t, mTokenGenerator.called, 1) |
| 126 | // Lets remove this pending ingester to no interfere with the next tests |
| 127 | rindDesc.RemoveIngester("pendingIngester-1-az-2") |
| 128 | |
| 129 | // Should generate tokens only for the ingesters with the smaller registered time when multiples |
| 130 | // ingesters does not have tokens |
| 131 | tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-1", zones[0], 512, false) |
| 132 | require.Len(t, tokens, 0) |
| 133 | tokens = minimizeTokenGenerator.GenerateTokens(rindDesc, "pendingIngester-2", zones[0], 512, false) |
| 134 | require.Len(t, tokens, 512) |
| 135 |
nothing calls this directly
no test coverage detected