diff --git a/pkg/compose/convergence.go b/pkg/compose/convergence.go index c855c05e1..d9b74de9a 100644 --- a/pkg/compose/convergence.go +++ b/pkg/compose/convergence.go @@ -55,6 +55,19 @@ const ( type convergence struct { service *composeService observedState map[string]Containers + stateMutex sync.Mutex +} + +func (c *convergence) getObservedState(serviceName string) Containers { + c.stateMutex.Lock() + defer c.stateMutex.Unlock() + return c.observedState[serviceName] +} + +func (c *convergence) setObservedState(serviceName string, containers Containers) { + c.stateMutex.Lock() + defer c.stateMutex.Unlock() + c.observedState[serviceName] = containers } func newConvergence(services []string, state Containers, s *composeService) *convergence { @@ -97,7 +110,7 @@ var mu sync.Mutex // updateProject updates project after service converged, so dependent services relying on `service:xx` can refer to actual containers. func (c *convergence) updateProject(project *types.Project, service string) { - containers := c.observedState[service] + containers := c.getObservedState(service) container := containers[0] // operation is protected by a Mutex so that we can safely update project.Services while running concurrent convergence on services @@ -148,7 +161,7 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project, if err != nil { return err } - containers := c.observedState[service.Name] + containers := c.getObservedState(service.Name) actual := len(containers) updated := make(Containers, expected) @@ -224,7 +237,7 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project, } err = eg.Wait() - c.observedState[service.Name] = updated + c.setObservedState(service.Name, updated) return err }