Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 9317ffc

Browse files
committed
Serialize access to observed state
This should fix concurrent accesses to the map. Signed-off-by: Mathieu Champlon <[email protected]>
1 parent 918fe00 commit 9317ffc

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

pkg/compose/convergence.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ const (
5555
type convergence struct {
5656
service *composeService
5757
observedState map[string]Containers
58+
stateMutex sync.Mutex
59+
}
60+
61+
func (c *convergence) getObservedState(serviceName string) Containers {
62+
c.stateMutex.Lock()
63+
defer c.stateMutex.Unlock()
64+
return c.observedState[serviceName]
65+
}
66+
67+
func (c *convergence) setObservedState(serviceName string, containers Containers) {
68+
c.stateMutex.Lock()
69+
defer c.stateMutex.Unlock()
70+
c.observedState[serviceName] = containers
5871
}
5972

6073
func newConvergence(services []string, state Containers, s *composeService) *convergence {
@@ -97,7 +110,7 @@ var mu sync.Mutex
97110

98111
// updateProject updates project after service converged, so dependent services relying on `service:xx` can refer to actual containers.
99112
func (c *convergence) updateProject(project *types.Project, service string) {
100-
containers := c.observedState[service]
113+
containers := c.getObservedState(service)
101114
container := containers[0]
102115

103116
// 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,
148161
if err != nil {
149162
return err
150163
}
151-
containers := c.observedState[service.Name]
164+
containers := c.getObservedState(service.Name)
152165
actual := len(containers)
153166
updated := make(Containers, expected)
154167

@@ -224,7 +237,7 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
224237
}
225238

226239
err = eg.Wait()
227-
c.observedState[service.Name] = updated
240+
c.setObservedState(service.Name, updated)
228241
return err
229242
}
230243

0 commit comments

Comments
 (0)