From 594da656def2212b7b3dc29d1ebfeafd0baa1454 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Thu, 9 Jul 2026 08:20:22 -0400 Subject: [PATCH] fix(reconcile): preserve zero-replica services during hashing Signed-off-by: Junhao Liao --- pkg/compose/convergence_test.go | 25 +++++++++++++++++++++++++ pkg/compose/hash.go | 4 +++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pkg/compose/convergence_test.go b/pkg/compose/convergence_test.go index 441356959b8..5b4514d067a 100644 --- a/pkg/compose/convergence_test.go +++ b/pkg/compose/convergence_test.go @@ -242,6 +242,31 @@ func TestWaitDependencies(t *testing.T) { } assert.NilError(t, tested.(*composeService).waitDependencies(t.Context(), &project, "", dependencies, nil, 0)) }) + t.Run("should skip zero-replica dependencies after service hashing", func(t *testing.T) { + replicas := 0 + project := types.Project{Name: strings.ToLower(testProject), Services: types.Services{ + "app": { + Name: "app", + DependsOn: types.DependsOnConfig{ + "disabled": { + Condition: ServiceConditionRunningOrHealthy, + Required: true, + }, + }, + }, + "disabled": { + Name: "disabled", + Deploy: &types.DeployConfig{Replicas: &replicas}, + }, + }} + + _, err := ServiceHash(project.Services["disabled"]) + assert.NilError(t, err) + + assert.NilError(t, tested.(*composeService).waitDependencies( + t.Context(), &project, "app", project.Services["app"].DependsOn, nil, 0, + )) + }) t.Run("should skip dependencies with condition service_started", func(t *testing.T) { dbService := types.ServiceConfig{Name: "db", Scale: intPtr(1)} redisService := types.ServiceConfig{Name: "redis", Scale: intPtr(1)} diff --git a/pkg/compose/hash.go b/pkg/compose/hash.go index 24c6cce2e88..1be19405faa 100644 --- a/pkg/compose/hash.go +++ b/pkg/compose/hash.go @@ -30,7 +30,9 @@ func ServiceHash(o types.ServiceConfig) (string, error) { o.PullPolicy = "" o.Scale = nil if o.Deploy != nil { - o.Deploy.Replicas = nil + deploy := *o.Deploy + deploy.Replicas = nil + o.Deploy = &deploy } o.DependsOn = nil o.Profiles = nil