Skip to content

Commit 2cbb3bc

Browse files
committed
Refactor leader election in manager.Start
1 parent 1fe24e5 commit 2cbb3bc

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
@@ -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

Comments
 (0)