Change:
}) } } <ins> func TestEndpointSliceTrackerDeleteService(t *testing.T) { svcName1, svcNS1 := "svc1", "ns1" svcName2, svcNS2 := "svc2", "ns2" epSlice1 := &discovery.EndpointSlice{ ObjectMeta: metav1.ObjectMeta{ Name:            "example-1", Namespace:       svcNS1, ResourceVersion: "rv1", Labels:          map[string]string{discovery.LabelServiceName: svcName1}, }, } testCases := map[string]struct { updateParam                     *discovery.EndpointSlice deleteServiceParam              *types.NamespacedName expectHas                       bool expectStale                     bool expectResourceVersionsByService map[types.NamespacedName]endpointSliceResourceVersions }{ "same service": { updateParam:                     epSlice1, deleteServiceParam:              &types.NamespacedName{Namespace: svcNS1, Name: svcName1}, expectHas:                       false, expectStale:                     true, expectResourceVersionsByService: map[types.NamespacedName]endpointSliceResourceVersions{}, }, "different namespace": { updateParam:        epSlice1, deleteServiceParam: &types.NamespacedName{Namespace: svcNS2, Name: svcName1}, expectHas:          true, expectStale:        false, expectResourceVersionsByService: map[types.NamespacedName]endpointSliceResourceVersions{ {Namespace: epSlice1.Namespace, Name: "svc1"}: { epSlice1.Name: epSlice1.ResourceVersion, }, }, }, "different service": { updateParam:        epSlice1, deleteServiceParam: &types.NamespacedName{Namespace: svcNS1, Name: svcName2}, expectHas:          true, expectStale:        false, expectResourceVersionsByService: map[types.NamespacedName]endpointSliceResourceVersions{ {Namespace: epSlice1.Namespace, Name: "svc1"}: { epSlice1.Name: epSlice1.ResourceVersion, }, }, }, } for name, tc := range testCases { t.Run(name, func(t *testing.T) { esTracker := newEndpointSliceTracker() esTracker.Update(tc.updateParam) esTracker.DeleteService(tc.deleteServiceParam.Namespace, tc.deleteServiceParam.Name) if esTracker.Has(tc.updateParam) != tc.expectHas { t.Errorf("tc.tracker.Has(%+v) == %t, expected %t", tc.updateParam, esTracker.Has(tc.updateParam), tc.expectHas) } if esTracker.Stale(tc.updateParam) != tc.expectStale { t.Errorf("tc.tracker.Stale(%+v) == %t, expected %t", tc.updateParam, esTracker.Stale(tc.updateParam), tc.expectStale) } assert.Equal(t, tc.expectResourceVersionsByService, esTracker.resourceVersionsByService) }) } } </ins>

Discussion:
<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks! If the matter is security related, please disclose it privately via --What happened: The endpointSliceTracker creates a set of resource versions for each service, the resource versions in the set could be deleted when endpointslices are deleted, but the set and its key in the map is never deleted, leading to memory leak. What you expected to happen: The set of resource versions should be delete from endpointSliceTracker when the service is deleted. Environment: Kubernetes version (use ): 1.18.5
There are no sig labels on this issue. Please add an appropriate label by using one of the following commands: - Please see the for a listing of the SIGs, working groups, and committees available. <detailsInstructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
/cc