@@ -30,12 +30,12 @@ type Manager struct {
30
30
31
31
// a single errG is used for all managed controllers, including those
32
32
// that are added after initialization
33
- errG * errgroup.Group
34
- errGCtx context.Context
33
+ errG * errgroup.Group // GUARDED_BY(lock)
34
+ errGCtx context.Context // GUARDED_BY(lock)
35
35
36
36
// a registry of cancel functions for each individual controller
37
- sync.RWMutex
38
- cancelFuncs map [Controller ]func ()
37
+ lock sync.RWMutex
38
+ cancelFuncs map [Controller ]func () // GUARDED_BY(lock)
39
39
40
40
// for broadcasting events
41
41
broadcaster record.EventBroadcaster
@@ -66,19 +66,19 @@ func NewManager(debugConfig *componentconfig.DebuggingConfiguration, address str
66
66
// health / debug endpoints for them. It stops when the context is cancelled.
67
67
// It will only have an effect the first time it is called.
68
68
func (m * Manager ) Start (ctx context.Context , readyc chan <- struct {}, controllers ... Controller ) error {
69
- m .RLock ()
69
+ m .lock . RLock ()
70
70
if m .errG != nil {
71
- m .RUnlock ()
71
+ m .lock . RUnlock ()
72
72
return fmt .Errorf ("manager already started" )
73
73
}
74
- m .RUnlock ()
74
+ m .lock . RUnlock ()
75
75
76
76
var startErr error
77
77
m .once .Do (func () {
78
- m .Lock ()
78
+ m .lock . Lock ()
79
79
m .errG , ctx = errgroup .WithContext (ctx )
80
80
m .errGCtx = ctx
81
- m .Unlock ()
81
+ m .lock . Unlock ()
82
82
83
83
// start controllers
84
84
if err := m .Go (controllers ... ); err != nil {
@@ -109,12 +109,12 @@ func (m *Manager) Start(ctx context.Context, readyc chan<- struct{}, controllers
109
109
<- ctx .Done ()
110
110
m .broadcaster .Shutdown ()
111
111
112
- m .Lock ()
112
+ m .lock . Lock ()
113
113
for ctrl , cancel := range m .cancelFuncs {
114
114
cancel ()
115
115
delete (m .cancelFuncs , ctrl )
116
116
}
117
- m .Unlock ()
117
+ m .lock . Unlock ()
118
118
119
119
// no context passed to shutdown; the errg will block
120
120
// until the server is closed
@@ -137,24 +137,24 @@ func (m *Manager) Start(ctx context.Context, readyc chan<- struct{}, controllers
137
137
138
138
// Go adds controllers into the existing manager's errgroup
139
139
func (m * Manager ) Go (controllers ... Controller ) error {
140
- m .RLock ()
140
+ m .lock . RLock ()
141
141
errG := m .errG
142
142
if errG == nil {
143
- m .RUnlock ()
143
+ m .lock . RUnlock ()
144
144
return fmt .Errorf ("cannot add controllers to an unstarted manager" )
145
145
}
146
146
ctx := m .errGCtx
147
- m .RUnlock ()
147
+ m .lock . RUnlock ()
148
148
149
149
// start newly added controllers
150
150
for _ , c := range controllers {
151
151
c := c
152
152
m .healthzHandler .AddHealthChecker (controllerhealthz .NamedHealthChecker (c .Name (), c .HealthChecker ()))
153
153
errG .Go (func () error {
154
154
ctx , cancel := context .WithCancel (ctx )
155
- m .Lock ()
155
+ m .lock . Lock ()
156
156
m .cancelFuncs [c ] = cancel
157
- m .Unlock ()
157
+ m .lock . Unlock ()
158
158
c .Start (ctx , runtime .GOMAXPROCS (0 ))
159
159
return nil
160
160
})
@@ -171,16 +171,16 @@ func (m *Manager) Go(controllers ...Controller) error {
171
171
func (m * Manager ) Cancel (controllers ... Controller ) {
172
172
names := make ([]string , 0 , len (controllers ))
173
173
for _ , c := range controllers {
174
- m .RLock ()
174
+ m .lock . RLock ()
175
175
cancel , ok := m .cancelFuncs [c ]
176
- m .RUnlock ()
176
+ m .lock . RUnlock ()
177
177
if ok {
178
178
cancel ()
179
179
}
180
180
names = append (names , c .Name ())
181
- m .Lock ()
181
+ m .lock . Lock ()
182
182
delete (m .cancelFuncs , c )
183
- m .Unlock ()
183
+ m .lock . Unlock ()
184
184
}
185
185
m .healthzHandler .RemoveHealthChecker (names ... )
186
186
}
0 commit comments