Merge pull request #79294 from tedyu/svc-ctrl-lock

Use RWMutex to improve locking for serviceCache
This commit is contained in:
Kubernetes Prow Robot 2019-06-24 11:24:28 -07:00 committed by GitHub
commit bc70f33e3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -75,7 +75,7 @@ type cachedService struct {
} }
type serviceCache struct { type serviceCache struct {
mu sync.Mutex // protects serviceMap mu sync.RWMutex // protects serviceMap
serviceMap map[string]*cachedService serviceMap map[string]*cachedService
} }
@ -375,8 +375,8 @@ func (s *ServiceController) ensureLoadBalancer(service *v1.Service) (*v1.LoadBal
// ListKeys implements the interface required by DeltaFIFO to list the keys we // ListKeys implements the interface required by DeltaFIFO to list the keys we
// already know about. // already know about.
func (s *serviceCache) ListKeys() []string { func (s *serviceCache) ListKeys() []string {
s.mu.Lock() s.mu.RLock()
defer s.mu.Unlock() defer s.mu.RUnlock()
keys := make([]string, 0, len(s.serviceMap)) keys := make([]string, 0, len(s.serviceMap))
for k := range s.serviceMap { for k := range s.serviceMap {
keys = append(keys, k) keys = append(keys, k)
@ -386,8 +386,8 @@ func (s *serviceCache) ListKeys() []string {
// GetByKey returns the value stored in the serviceMap under the given key // GetByKey returns the value stored in the serviceMap under the given key
func (s *serviceCache) GetByKey(key string) (interface{}, bool, error) { func (s *serviceCache) GetByKey(key string) (interface{}, bool, error) {
s.mu.Lock() s.mu.RLock()
defer s.mu.Unlock() defer s.mu.RUnlock()
if v, ok := s.serviceMap[key]; ok { if v, ok := s.serviceMap[key]; ok {
return v, true, nil return v, true, nil
} }
@ -397,8 +397,8 @@ func (s *serviceCache) GetByKey(key string) (interface{}, bool, error) {
// ListKeys implements the interface required by DeltaFIFO to list the keys we // ListKeys implements the interface required by DeltaFIFO to list the keys we
// already know about. // already know about.
func (s *serviceCache) allServices() []*v1.Service { func (s *serviceCache) allServices() []*v1.Service {
s.mu.Lock() s.mu.RLock()
defer s.mu.Unlock() defer s.mu.RUnlock()
services := make([]*v1.Service, 0, len(s.serviceMap)) services := make([]*v1.Service, 0, len(s.serviceMap))
for _, v := range s.serviceMap { for _, v := range s.serviceMap {
services = append(services, v.state) services = append(services, v.state)
@ -407,8 +407,8 @@ func (s *serviceCache) allServices() []*v1.Service {
} }
func (s *serviceCache) get(serviceName string) (*cachedService, bool) { func (s *serviceCache) get(serviceName string) (*cachedService, bool) {
s.mu.Lock() s.mu.RLock()
defer s.mu.Unlock() defer s.mu.RUnlock()
service, ok := s.serviceMap[serviceName] service, ok := s.serviceMap[serviceName]
return service, ok return service, ok
} }