@@ -40,11 +40,11 @@ import (
4040)
4141
4242const (
43- controllerName = "leader-election-controller"
44- ElectedByAnnotationName = "coordination.k8s.io/elected-by" // Value should be set to controllerName
43+ controllerName = "leader-election-controller"
4544
4645 // Requeue interval is the interval at which a Lease is requeued to verify that it is being renewed properly.
47- requeueInterval = 5 * time .Second
46+ defaultRequeueInterval = 5 * time .Second
47+ noRequeue = 0
4848 defaultLeaseDurationSeconds int32 = 5
4949
5050 electionDuration = 5 * time .Second
@@ -158,10 +158,10 @@ func (c *Controller) processNextElectionItem(ctx context.Context) bool {
158158 return false
159159 }
160160
161- completed , err := c .reconcileElectionStep (ctx , key )
161+ intervalForRequeue , err := c .reconcileElectionStep (ctx , key )
162162 utilruntime .HandleError (err )
163- if completed {
164- defer c .queue .AddAfter (key , requeueInterval )
163+ if intervalForRequeue != noRequeue {
164+ defer c .queue .AddAfter (key , intervalForRequeue )
165165 }
166166 c .queue .Done (key )
167167 return true
@@ -237,22 +237,25 @@ func (c *Controller) electionNeeded(candidates []*v1alpha1.LeaseCandidate, lease
237237// PingTime + electionDuration > time.Now: We just asked all candidates to ack and are still waiting for response
238238// PingTime + electionDuration < time.Now: Candidate has not responded within the appropriate PingTime. Continue the election.
239239// RenewTime + 5 seconds > time.Now: All candidates acked in the last 5 seconds, continue the election.
240- func (c * Controller ) reconcileElectionStep (ctx context.Context , leaseNN types.NamespacedName ) (requeue bool , err error ) {
240+ func (c * Controller ) reconcileElectionStep (ctx context.Context , leaseNN types.NamespacedName ) (requeue time. Duration , err error ) {
241241 now := time .Now ()
242242
243243 candidates , err := c .listAdmissableCandidates (leaseNN )
244244 if err != nil {
245- return true , err
245+ return defaultRequeueInterval , err
246246 } else if len (candidates ) == 0 {
247- return false , nil
247+ return noRequeue , nil
248248 }
249- klog .V (4 ).Infof ("reconcileElectionStep %q %q , candidates: %d" , leaseNN . Namespace , leaseNN . Name , len (candidates ))
249+ klog .V (4 ).Infof ("reconcileElectionStep %s , candidates: %d" , leaseNN , len (candidates ))
250250
251251 // Check if an election is really needed by looking at the current lease
252252 // and set of candidates
253253 needElection , err := c .electionNeeded (candidates , leaseNN )
254- if ! needElection || err != nil {
255- return needElection , err
254+ if ! needElection {
255+ return noRequeue , err
256+ }
257+ if err != nil {
258+ return defaultRequeueInterval , err
256259 }
257260
258261 fastTrackElection := false
@@ -263,15 +266,15 @@ func (c *Controller) reconcileElectionStep(ctx context.Context, leaseNN types.Na
263266 if candidate .Spec .PingTime != nil {
264267 if candidate .Spec .PingTime .Add (electionDuration ).After (now ) {
265268 // continue waiting for the election to timeout
266- return false , nil
269+ return noRequeue , nil
267270 } else {
268271 // election timed out without ack. Clear and start election.
269272 fastTrackElection = true
270273 clone := candidate .DeepCopy ()
271274 clone .Spec .PingTime = nil
272275 _ , err := c .leaseCandidateClient .LeaseCandidates (clone .Namespace ).Update (ctx , clone , metav1.UpdateOptions {})
273276 if err != nil {
274- return false , err
277+ return noRequeue , err
275278 }
276279 break
277280 }
@@ -294,10 +297,10 @@ func (c *Controller) reconcileElectionStep(ctx context.Context, leaseNN types.Na
294297 clone .Spec .PingTime = & metav1.MicroTime {Time : time .Now ()}
295298 _ , err := c .leaseCandidateClient .LeaseCandidates (clone .Namespace ).Update (ctx , clone , metav1.UpdateOptions {})
296299 if err != nil {
297- return false , err
300+ return noRequeue , err
298301 }
299302 }
300- return true , nil
303+ return defaultRequeueInterval , nil
301304 }
302305 }
303306
@@ -308,22 +311,22 @@ func (c *Controller) reconcileElectionStep(ctx context.Context, leaseNN types.Na
308311 }
309312 }
310313 if len (ackedCandidates ) == 0 {
311- return false , fmt .Errorf ("no available candidates" )
314+ return noRequeue , fmt .Errorf ("no available candidates" )
312315 }
313316
314317 strategy , err := pickBestStrategy (ackedCandidates )
315318 if err != nil {
316- return false , err
319+ return noRequeue , err
317320 }
318321
319322 if strategy != v1 .OldestEmulationVersion {
320323 klog .V (2 ).Infof ("strategy %s is not recognized by CLE." , strategy )
321- return false , nil
324+ return noRequeue , nil
322325 }
323326 electee := pickBestLeaderOldestEmulationVersion (ackedCandidates )
324327
325328 if electee == nil {
326- return false , fmt .Errorf ("should not happen, could not find suitable electee" )
329+ return noRequeue , fmt .Errorf ("should not happen, could not find suitable electee" )
327330 }
328331
329332 electeeName := electee .Name
@@ -332,9 +335,6 @@ func (c *Controller) reconcileElectionStep(ctx context.Context, leaseNN types.Na
332335 ObjectMeta : metav1.ObjectMeta {
333336 Namespace : leaseNN .Namespace ,
334337 Name : leaseNN .Name ,
335- Annotations : map [string ]string {
336- ElectedByAnnotationName : controllerName ,
337- },
338338 },
339339 Spec : v1.LeaseSpec {
340340 HolderIdentity : & electeeName ,
@@ -346,50 +346,47 @@ func (c *Controller) reconcileElectionStep(ctx context.Context, leaseNN types.Na
346346 _ , err = c .leaseClient .Leases (leaseNN .Namespace ).Create (ctx , leaderLease , metav1.CreateOptions {})
347347 // If the create was successful, then we can return here.
348348 if err == nil {
349- klog .Infof ("Created lease %q %q for %q" , leaseNN . Namespace , leaseNN . Name , electee .Name )
350- return true , nil
349+ klog .Infof ("Created lease %s for %q" , leaseNN , electee .Name )
350+ return defaultRequeueInterval , nil
351351 }
352352
353353 // If there was an error, return
354354 if ! apierrors .IsAlreadyExists (err ) {
355- return false , err
355+ return noRequeue , err
356356 }
357357
358358 existingLease , err := c .leaseClient .Leases (leaseNN .Namespace ).Get (ctx , leaseNN .Name , metav1.GetOptions {})
359359 if err != nil {
360- return false , err
360+ return noRequeue , err
361361 }
362362 leaseClone := existingLease .DeepCopy ()
363363
364364 // Update the Lease if it either does not have a holder or is expired
365365 isExpired := isLeaseExpired (existingLease )
366366 if leaseClone .Spec .HolderIdentity == nil || * leaseClone .Spec .HolderIdentity == "" || (isExpired && * leaseClone .Spec .HolderIdentity != electeeName ) {
367- klog .Infof ("lease %q %q is expired, resetting it and setting holder to %q" , leaseNN . Namespace , leaseNN . Name , electee .Name )
367+ klog .Infof ("lease %s is expired, resetting it and setting holder to %q" , leaseNN , electee .Name )
368368 leaseClone .Spec .Strategy = & strategy
369369 leaseClone .Spec .PreferredHolder = nil
370- if leaseClone .ObjectMeta .Annotations == nil {
371- leaseClone .ObjectMeta .Annotations = make (map [string ]string )
372- }
373- leaseClone .ObjectMeta .Annotations [ElectedByAnnotationName ] = controllerName
374370 leaseClone .Spec .HolderIdentity = & electeeName
375371
376372 leaseClone .Spec .RenewTime = & metav1.MicroTime {Time : time .Now ()}
377373 leaseClone .Spec .LeaseDurationSeconds = ptr .To (defaultLeaseDurationSeconds )
378374 leaseClone .Spec .AcquireTime = nil
379375 _ , err = c .leaseClient .Leases (leaseNN .Namespace ).Update (ctx , leaseClone , metav1.UpdateOptions {})
380376 if err != nil {
381- return false , err
377+ return time . Until ( leaseClone . Spec . RenewTime . Time ) , err
382378 }
383379 } else if leaseClone .Spec .HolderIdentity != nil && * leaseClone .Spec .HolderIdentity != electeeName {
384- klog .Infof ("lease %q %q already exists for holder %q but should be held by %q, marking preferredHolder" , leaseNN . Namespace , leaseNN . Name , * leaseClone .Spec .HolderIdentity , electee .Name )
380+ klog .Infof ("lease %s already exists for holder %q but should be held by %q, marking preferredHolder" , leaseNN , * leaseClone .Spec .HolderIdentity , electee .Name )
385381 leaseClone .Spec .PreferredHolder = & electeeName
386382 leaseClone .Spec .Strategy = & strategy
387383 _ , err = c .leaseClient .Leases (leaseNN .Namespace ).Update (ctx , leaseClone , metav1.UpdateOptions {})
388384 if err != nil {
389- return false , err
385+ return noRequeue , err
390386 }
387+ return time .Until (leaseClone .Spec .RenewTime .Time ), nil
391388 }
392- return true , nil
389+ return defaultRequeueInterval , nil
393390}
394391
395392func (c * Controller ) listAdmissableCandidates (leaseNN types.NamespacedName ) ([]* v1alpha1.LeaseCandidate , error ) {
0 commit comments