@@ -158,41 +158,15 @@ func (cm *controllerManager) GetRESTMapper() meta.RESTMapper {
158158}
159159
160160func (cm * controllerManager ) Start (stop <- chan struct {}) error {
161- if cm .resourceLock == nil {
162- go cm .start (stop )
163- select {
164- case <- stop :
165- // we are done
166- return nil
167- case err := <- cm .errChan :
168- // Error starting a controller
161+ if cm .resourceLock != nil {
162+ err := cm .startLeaderElection (stop )
163+ if err != nil {
169164 return err
170165 }
166+ } else {
167+ go cm .start (stop )
171168 }
172169
173- l , err := leaderelection .NewLeaderElector (leaderelection.LeaderElectionConfig {
174- Lock : cm .resourceLock ,
175- // Values taken from: https://github.com/kubernetes/apiserver/blob/master/pkg/apis/config/v1alpha1/defaults.go
176- // TODO(joelspeed): These timings should be configurable
177- LeaseDuration : 15 * time .Second ,
178- RenewDeadline : 10 * time .Second ,
179- RetryPeriod : 2 * time .Second ,
180- Callbacks : leaderelection.LeaderCallbacks {
181- OnStartedLeading : cm .start ,
182- OnStoppedLeading : func () {
183- // Most implementations of leader election log.Fatal() here.
184- // Since Start is wrapped in log.Fatal when called, we can just return
185- // an error here which will cause the program to exit.
186- cm .errChan <- fmt .Errorf ("leader election lost" )
187- },
188- },
189- })
190- if err != nil {
191- return err
192- }
193-
194- go l .Run ()
195-
196170 select {
197171 case <- stop :
198172 // We are done
@@ -235,3 +209,32 @@ func (cm *controllerManager) start(stop <-chan struct{}) {
235209
236210 cm .started = true
237211}
212+
213+ func (cm * controllerManager ) startLeaderElection (stop <- chan struct {}) (err error ) {
214+ l , err := leaderelection .NewLeaderElector (leaderelection.LeaderElectionConfig {
215+ Lock : cm .resourceLock ,
216+ // Values taken from: https://github.com/kubernetes/apiserver/blob/master/pkg/apis/config/v1alpha1/defaults.go
217+ // TODO(joelspeed): These timings should be configurable
218+ LeaseDuration : 15 * time .Second ,
219+ RenewDeadline : 10 * time .Second ,
220+ RetryPeriod : 2 * time .Second ,
221+ Callbacks : leaderelection.LeaderCallbacks {
222+ OnStartedLeading : func (_ <- chan struct {}) {
223+ cm .start (stop )
224+ },
225+ OnStoppedLeading : func () {
226+ // Most implementations of leader election log.Fatal() here.
227+ // Since Start is wrapped in log.Fatal when called, we can just return
228+ // an error here which will cause the program to exit.
229+ cm .errChan <- fmt .Errorf ("leader election lost" )
230+ },
231+ },
232+ })
233+ if err != nil {
234+ return err
235+ }
236+
237+ // Start the leader elector process
238+ go l .Run ()
239+ return nil
240+ }
0 commit comments