(t *testing.T)
| 3006 | } |
| 3007 | |
| 3008 | func 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()) |
nothing calls this directly
no test coverage detected