From 17977478e7d017c75433d887292732263ecdf1d5 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Fri, 29 Jun 2018 22:19:01 +0800 Subject: [PATCH] RWLock for cache --- pkg/scheduler/cache/cache.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/scheduler/cache/cache.go b/pkg/scheduler/cache/cache.go index fd04a044c6..201b214bee 100644 --- a/pkg/scheduler/cache/cache.go +++ b/pkg/scheduler/cache/cache.go @@ -52,7 +52,7 @@ type schedulerCache struct { period time.Duration // This mutex guards all fields within this cache struct. - mu sync.Mutex + mu sync.RWMutex // a set of assumed pod keys. // The key could further be used to get an entry in podStates. assumedPods map[string]bool @@ -112,8 +112,8 @@ func newSchedulerCache(ttl, period time.Duration, stop <-chan struct{}) *schedul // Snapshot takes a snapshot of the current schedulerCache. The method has performance impact, // and should be only used in non-critical path. func (cache *schedulerCache) Snapshot() *Snapshot { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() nodes := make(map[string]*NodeInfo) for k, v := range cache.nodes { @@ -164,8 +164,8 @@ func (cache *schedulerCache) List(selector labels.Selector) ([]*v1.Pod, error) { } func (cache *schedulerCache) FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() // podFilter is expected to return true for most or all of the pods. We // can avoid expensive array growth without wasting too much memory by // pre-allocating capacity. @@ -216,8 +216,8 @@ func (cache *schedulerCache) finishBinding(pod *v1.Pod, now time.Time) error { return err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() glog.V(5).Infof("Finished binding for pod %v. Can be expired.", key) currState, ok := cache.podStates[key] @@ -387,8 +387,8 @@ func (cache *schedulerCache) IsAssumedPod(pod *v1.Pod) (bool, error) { return false, err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() b, found := cache.assumedPods[key] if !found { @@ -403,8 +403,8 @@ func (cache *schedulerCache) GetPod(pod *v1.Pod) (*v1.Pod, error) { return nil, err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() podState, ok := cache.podStates[key] if !ok { @@ -539,8 +539,8 @@ func (cache *schedulerCache) RemovePDB(pdb *policy.PodDisruptionBudget) error { } func (cache *schedulerCache) ListPDBs(selector labels.Selector) ([]*policy.PodDisruptionBudget, error) { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() var pdbs []*policy.PodDisruptionBudget for _, pdb := range cache.pdbs { if selector.Matches(labels.Set(pdb.Labels)) { @@ -551,8 +551,8 @@ func (cache *schedulerCache) ListPDBs(selector labels.Selector) ([]*policy.PodDi } func (cache *schedulerCache) IsUpToDate(n *NodeInfo) bool { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() node, ok := cache.nodes[n.Node().Name] return ok && n.generation == node.generation }