func()

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
}