Skip to content

Commit c5d6a9d

Browse files
committed
optimized compute targets func
1 parent 28ac996 commit c5d6a9d

File tree

1 file changed

+37
-16
lines changed

1 file changed

+37
-16
lines changed

apps/workspace-engine/pkg/workspace/store/release_targets.go

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,32 +38,53 @@ func (r *ReleaseTargets) computeTargets(ctx context.Context) (map[string]*oapi.R
3838
_, span := tracer.Start(ctx, "computeTargets")
3939
defer span.End()
4040

41-
releaseTargets := make(map[string]*oapi.ReleaseTarget, 1000)
42-
4341
environments := r.store.Environments
4442
deployments := r.store.Deployments
4543

44+
// Index deployments by SystemId to avoid O(E*D) nested loop
45+
deploymentsBySystem := make(map[string][]*oapi.Deployment)
46+
for depItem := range deployments.IterBuffered() {
47+
deployment := depItem.Val
48+
deploymentsBySystem[deployment.SystemId] = append(deploymentsBySystem[deployment.SystemId], deployment)
49+
}
50+
51+
// Pre-allocate based on a reasonable estimate
52+
releaseTargets := make(map[string]*oapi.ReleaseTarget, 1000)
53+
4654
for envItem := range environments.IterBuffered() {
4755
environment := envItem.Val
56+
57+
// Only process deployments in the same system
58+
systemDeployments, ok := deploymentsBySystem[environment.SystemId]
59+
if !ok {
60+
continue
61+
}
4862

49-
for depItem := range deployments.IterBuffered() {
50-
deployment := depItem.Val
63+
// Get environment resources once per environment
64+
envResources := environments.Resources(environment.Id)
65+
if len(envResources) == 0 {
66+
continue
67+
}
5168

52-
if environment.SystemId != deployment.SystemId {
69+
for _, deployment := range systemDeployments {
70+
// Get deployment resources once per deployment
71+
depResources := deployments.Resources(deployment.Id)
72+
if len(depResources) == 0 {
5373
continue
5474
}
5575

56-
key := environment.Id + ":" + deployment.Id
57-
58-
for _, resource := range environments.Resources(environment.Id) {
59-
if !deployments.HasResource(deployment.Id, resource.Id) {
60-
continue
61-
}
62-
releaseTargetId := key + ":" + resource.Id
63-
releaseTargets[releaseTargetId] = &oapi.ReleaseTarget{
64-
EnvironmentId: environment.Id,
65-
DeploymentId: deployment.Id,
66-
ResourceId: resource.Id,
76+
// Pre-compute the env:deployment key part
77+
keyPrefix := environment.Id + ":" + deployment.Id + ":"
78+
79+
// Find intersection of resources
80+
for resourceId := range envResources {
81+
if _, hasResource := depResources[resourceId]; hasResource {
82+
releaseTargetId := keyPrefix + resourceId
83+
releaseTargets[releaseTargetId] = &oapi.ReleaseTarget{
84+
EnvironmentId: environment.Id,
85+
DeploymentId: deployment.Id,
86+
ResourceId: resourceId,
87+
}
6788
}
6889
}
6990
}

0 commit comments

Comments
 (0)