@@ -55,6 +55,19 @@ const (
5555type 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
6073func 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.
99112func (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