@@ -55,6 +55,19 @@ const (
55
55
type convergence struct {
56
56
service * composeService
57
57
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
58
71
}
59
72
60
73
func newConvergence (services []string , state Containers , s * composeService ) * convergence {
@@ -97,7 +110,7 @@ var mu sync.Mutex
97
110
98
111
// updateProject updates project after service converged, so dependent services relying on `service:xx` can refer to actual containers.
99
112
func (c * convergence ) updateProject (project * types.Project , service string ) {
100
- containers := c .observedState [ service ]
113
+ containers := c .getObservedState ( service )
101
114
container := containers [0 ]
102
115
103
116
// 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,
148
161
if err != nil {
149
162
return err
150
163
}
151
- containers := c .observedState [ service .Name ]
164
+ containers := c .getObservedState ( service .Name )
152
165
actual := len (containers )
153
166
updated := make (Containers , expected )
154
167
@@ -224,7 +237,7 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
224
237
}
225
238
226
239
err = eg .Wait ()
227
- c .observedState [ service .Name ] = updated
240
+ c .setObservedState ( service .Name , updated )
228
241
return err
229
242
}
230
243
0 commit comments