@@ -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
@@ -243,3 +217,32 @@ func (cm *controllerManager) start(stop <-chan struct{}) {
243217 return
244218 }
245219}
220+
221+ func (cm * controllerManager ) startLeaderElection (stop <- chan struct {}) (err error ) {
222+ l , err := leaderelection .NewLeaderElector (leaderelection.LeaderElectionConfig {
223+ Lock : cm .resourceLock ,
224+ // Values taken from: https://github.com/kubernetes/apiserver/blob/master/pkg/apis/config/v1alpha1/defaults.go
225+ // TODO(joelspeed): These timings should be configurable
226+ LeaseDuration : 15 * time .Second ,
227+ RenewDeadline : 10 * time .Second ,
228+ RetryPeriod : 2 * time .Second ,
229+ Callbacks : leaderelection.LeaderCallbacks {
230+ OnStartedLeading : func (_ <- chan struct {}) {
231+ cm .start (stop )
232+ },
233+ OnStoppedLeading : func () {
234+ // Most implementations of leader election log.Fatal() here.
235+ // Since Start is wrapped in log.Fatal when called, we can just return
236+ // an error here which will cause the program to exit.
237+ cm .errChan <- fmt .Errorf ("leader election lost" )
238+ },
239+ },
240+ })
241+ if err != nil {
242+ return err
243+ }
244+
245+ // Start the leader elector process
246+ go l .Run ()
247+ return nil
248+ }
0 commit comments