in pkg/profiling/continuous/checkers.go [205:258]
func (c *Checkers) updatePolicyCache() (bool, error) {
processes := c.processOperator.FindAllRegisteredProcesses()
if len(processes) == 0 {
// if existing policies, then clean it
if (len(c.policiesCache)) > 0 {
c.policiesCache = make(map[string]*base.ServicePolicy)
return true, nil
}
return false, nil
}
serviceProcesses := make(map[string]map[string]api.ProcessInterface)
// get all existing service and policy UUID mapping
servicePolicyUUIDCache := make(map[string]string, 0)
for _, p := range processes {
serviceName := p.Entity().ServiceName
cachedPolicy := c.policiesCache[serviceName]
if cachedPolicy != nil {
servicePolicyUUIDCache[serviceName] = cachedPolicy.UUID
} else {
servicePolicyUUIDCache[serviceName] = ""
}
// build the service process
serviceProcessesMap := serviceProcesses[serviceName]
if serviceProcessesMap == nil {
serviceProcessesMap = make(map[string]api.ProcessInterface)
serviceProcesses[serviceName] = serviceProcessesMap
}
serviceProcessesMap[p.ID()] = p
}
policiesUpdates, err := c.queryPolicyUpdates(servicePolicyUUIDCache)
if err != nil {
return false, err
}
hasUpdate := false
for serviceName, policy := range policiesUpdates {
existingPolicy := c.policiesCache[serviceName]
// update cache if the service policy not exist or UUID are not same
if existingPolicy == nil || existingPolicy.UUID != policy.UUID {
existingPolicy = policy
c.policiesCache[serviceName] = policy
hasUpdate = true
}
// update the processes if they are not same
if !c.checkProcessesAreSame(existingPolicy.Processes, serviceProcesses[serviceName]) {
hasUpdate = true
existingPolicy.Processes = serviceProcesses[serviceName]
}
}
return hasUpdate, nil
}