Fix a data race in TopologyCache

The member variable `cpuRatiosByZone` should be accessed with the lock
acquired as it could be be updated by `SetNodes` concurrently.

Signed-off-by: Quan Tian <qtian@vmware.com>
Co-authored-by: Antonio Ojea <aojea@google.com>
This commit is contained in:
Quan Tian
2023-04-12 23:51:23 +08:00
parent 2f1db33dd5
commit d567d61aa5
2 changed files with 66 additions and 3 deletions

View File

@@ -270,6 +270,9 @@ func (t *TopologyCache) HasPopulatedHints(serviceKey string) bool {
// it is not possible to provide allocations that are below the overload
// threshold, a nil value will be returned.
func (t *TopologyCache) getAllocations(numEndpoints int) (map[string]Allocation, *EventBuilder) {
t.lock.Lock()
defer t.lock.Unlock()
// it is similar to checking !t.sufficientNodeInfo
if t.cpuRatiosByZone == nil {
return nil, &EventBuilder{
@@ -293,9 +296,6 @@ func (t *TopologyCache) getAllocations(numEndpoints int) (map[string]Allocation,
}
}
t.lock.Lock()
defer t.lock.Unlock()
remainingMinEndpoints := numEndpoints
minTotal := 0
allocations := map[string]Allocation{}