in pkg/pool/pool.go [133:232]
func (p *pool) ReSync(upstreamResourceGroupIDs []string) {
p.lock.Lock()
defer p.lock.Unlock()
// This is possible if two Re-Syn were requested at same time
if !p.reSyncRequired {
p.log.Info("duplicate re-sync request, will be ignored")
return
}
p.reSyncRequired = false
// Convert list of upstream resource group ids into a list of Resource
var upstreamResource []Resource
for _, resourceGroupID := range upstreamResourceGroupIDs {
if resourceGroupID == "" {
continue
}
if p.isPDPool {
resourceIDs, err := utils.DeconstructIPsFromPrefix(resourceGroupID)
if err != nil {
p.log.Error(err, "failed to sync upstream resource", "resource group id", resourceGroupID, "err", err)
continue
}
var resources []Resource
for _, resourceID := range resourceIDs {
resources = append(resources, Resource{resourceGroupID, resourceID})
}
upstreamResource = append(upstreamResource, resources...)
} else {
upstreamResource = append(upstreamResource, Resource{resourceGroupID, resourceGroupID})
}
}
// Get the list of local resources
var localResources []Resource
for _, coolDownResource := range p.coolDownQueue {
localResources = append(localResources, coolDownResource.Resource)
}
for _, usedResource := range p.usedResources {
localResources = append(localResources, usedResource)
}
for _, warmResources := range p.warmResources {
localResources = append(localResources, warmResources...)
}
// resources that are present upstream but missing in the pool
newResources := utils.Difference(upstreamResource, localResources)
// resources that are deleted from upstream but still present in the pool
deletedResources := utils.Difference(localResources, upstreamResource)
if len(newResources) == 0 && len(deletedResources) == 0 {
p.log.Info("local and upstream state is in sync")
return
}
if len(newResources) > 0 {
p.log.Info("adding new resources to warm pool", "resource", newResources)
for _, resource := range newResources {
p.warmResources[resource.GroupID] = append(p.warmResources[resource.GroupID], resource)
}
}
if len(deletedResources) > 0 {
p.log.Info("attempting to remove deleted resources",
"deleted resources", deletedResources)
for _, resource := range deletedResources {
// remove deleted resource from list of warm resources of the resource group
for i := len(p.warmResources[resource.GroupID]) - 1; i >= 0; i-- {
if p.warmResources[resource.GroupID] == nil || len(p.warmResources[resource.GroupID]) == 0 {
continue
}
warmResource := p.warmResources[resource.GroupID][i]
if warmResource.ResourceID == resource.ResourceID {
p.log.Info("removing resource from warm pool",
"group id", resource.GroupID, "resource id", resource.ResourceID)
p.warmResources[resource.GroupID] = append(p.warmResources[resource.GroupID][:i], p.warmResources[resource.GroupID][i+1:]...)
// if the removed resource is the only one in the group, then delete the resource group from warm pool
if len(p.warmResources[resource.GroupID]) == 0 {
delete(p.warmResources, resource.GroupID)
}
}
}
// remove deleted resource from cool down queue
for i := len(p.coolDownQueue) - 1; i >= 0; i-- {
coolDownResource := p.coolDownQueue[i]
if coolDownResource.Resource.GroupID == resource.GroupID &&
coolDownResource.Resource.ResourceID == resource.ResourceID {
p.log.Info("removing resource from cool down queue",
"group id", resource.GroupID, "resource id", resource.ResourceID)
p.coolDownQueue = append(p.coolDownQueue[:i], p.coolDownQueue[i+1:]...)
}
}
}
}
}