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

Function TestRing_ShuffleShardWithLookback_Caching

ring/ring_test.go:3008–3418  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

3006}
3007
3008func TestRing_ShuffleShardWithLookback_Caching(t *testing.T) {
3009 t.Parallel()
3010
3011 userID := "user-1"
3012 otherUserID := "user-2"
3013 subringSize := 3
3014 now := time.Now()
3015
3016 scenarios := map[string]struct {
3017 instances []InstanceDesc
3018 test func(t *testing.T, ring *Ring)
3019 }{
3020 "identical request": {
3021 instances: []InstanceDesc{
3022 generateRingInstanceWithInfo("instance-1", "zone-a", []uint32{userToken(userID, "zone-a", 0) + 1}, now.Add(-2*time.Hour)),
3023 generateRingInstanceWithInfo("instance-2", "zone-a", []uint32{userToken(userID, "zone-a", 1) + 1}, now.Add(-2*time.Hour)),
3024 generateRingInstanceWithInfo("instance-3", "zone-b", []uint32{userToken(userID, "zone-b", 0) + 1}, now.Add(-2*time.Hour)),
3025 generateRingInstanceWithInfo("instance-4", "zone-b", []uint32{userToken(userID, "zone-b", 1) + 1}, now.Add(-2*time.Hour)),
3026 generateRingInstanceWithInfo("instance-5", "zone-c", []uint32{userToken(userID, "zone-c", 0) + 1}, now.Add(-2*time.Hour)),
3027 generateRingInstanceWithInfo("instance-6", "zone-c", []uint32{userToken(userID, "zone-c", 1) + 1}, now.Add(-2*time.Hour)),
3028 },
3029 test: func(t *testing.T, ring *Ring) {
3030 first := ring.ShuffleShardWithLookback(userID, subringSize, time.Hour, now)
3031 second := ring.ShuffleShardWithLookback(userID, subringSize, time.Hour, now)
3032 require.Same(t, first, second)
3033
3034 rs, err := first.GetAllHealthy(Read)
3035 require.NoError(t, err)
3036 require.ElementsMatch(t, []string{"instance-1", "instance-3", "instance-5"}, rs.GetAddresses())
3037
3038 require.Equal(t, 3, first.ZonesCount())
3039 require.Equal(t, 1, first.InstancesInZoneCount("zone-a"))
3040 require.Equal(t, 1, first.InstancesInZoneCount("zone-b"))
3041 require.Equal(t, 1, first.InstancesInZoneCount("zone-c"))
3042 require.Equal(t, 3, second.ZonesCount())
3043 require.Equal(t, 1, second.InstancesInZoneCount("zone-a"))
3044 require.Equal(t, 1, second.InstancesInZoneCount("zone-b"))
3045 require.Equal(t, 1, second.InstancesInZoneCount("zone-c"))
3046 },
3047 },
3048 "identical request after cleaning subring cache": {
3049 instances: []InstanceDesc{
3050 generateRingInstanceWithInfo("instance-1", "zone-a", []uint32{userToken(userID, "zone-a", 0) + 1}, now.Add(-2*time.Hour)),
3051 generateRingInstanceWithInfo("instance-2", "zone-a", []uint32{userToken(userID, "zone-a", 1) + 1}, now.Add(-2*time.Hour)),
3052 generateRingInstanceWithInfo("instance-3", "zone-b", []uint32{userToken(userID, "zone-b", 0) + 1}, now.Add(-2*time.Hour)),
3053 generateRingInstanceWithInfo("instance-4", "zone-b", []uint32{userToken(userID, "zone-b", 1) + 1}, now.Add(-2*time.Hour)),
3054 generateRingInstanceWithInfo("instance-5", "zone-c", []uint32{userToken(userID, "zone-c", 0) + 1}, now.Add(-2*time.Hour)),
3055 generateRingInstanceWithInfo("instance-6", "zone-c", []uint32{userToken(userID, "zone-c", 1) + 1}, now.Add(-2*time.Hour)),
3056 },
3057 test: func(t *testing.T, ring *Ring) {
3058 first := ring.ShuffleShardWithLookback(userID, subringSize, time.Hour, now)
3059 ring.CleanupShuffleShardCache(userID)
3060 second := ring.ShuffleShardWithLookback(userID, subringSize, time.Hour, now)
3061 require.NotSame(t, first, second)
3062
3063 firstReplicationSet, err := first.GetAllHealthy(Read)
3064 require.NoError(t, err)
3065 require.ElementsMatch(t, []string{"instance-1", "instance-3", "instance-5"}, firstReplicationSet.GetAddresses())

Callers

nothing calls this directly

Calls 15

userTokenFunction · 0.85
GetAddressesMethod · 0.80
RunMethod · 0.80
updateRingStateMethod · 0.80
AddMethod · 0.65
GetAllHealthyMethod · 0.65
ZonesCountMethod · 0.65
InstancesInZoneCountMethod · 0.65

Tested by

no test coverage detected