Skip to content

Commit c43acb5

Browse files
authored
Merge pull request kubernetes-sigs#176 from pusher/refactor-le
Refactor leader election in manager.Start
2 parents b305bfb + 2cbb3bc commit c43acb5

File tree

1 file changed

+34
-31
lines changed

1 file changed

+34
-31
lines changed

pkg/manager/internal.go

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -158,41 +158,15 @@ func (cm *controllerManager) GetRESTMapper() meta.RESTMapper {
158158
}
159159

160160
func (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

Comments
 (0)