Created
October 25, 2021 07:15
-
-
Save mayankshah1607/ca1a7882008c93af42faefc5bc670ad6 to your computer and use it in GitHub Desktop.
tryAcquireOrRenew
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func (le *LeaderElector) tryAcquireOrRenew(ctx context.Context) bool { | |
now := metav1.Now() | |
leaderElectionRecord := rl.LeaderElectionRecord{ | |
HolderIdentity: le.config.Lock.Identity(), | |
LeaseDurationSeconds: int(le.config.LeaseDuration / time.Second), | |
RenewTime: now, | |
AcquireTime: now, | |
} | |
// 1. obtain or create the ElectionRecord | |
oldLeaderElectionRecord, oldLeaderElectionRawRecord, err := le.config.Lock.Get(ctx) | |
if err != nil { | |
if !errors.IsNotFound(err) { | |
klog.Errorf("error retrieving resource lock %v: %v", le.config.Lock.Describe(), err) | |
return false | |
} | |
if err = le.config.Lock.Create(ctx, leaderElectionRecord); err != nil { | |
klog.Errorf("error initially creating leader election record: %v", err) | |
return false | |
} | |
le.setObservedRecord(&leaderElectionRecord) | |
return true | |
} | |
// 2. Record obtained, check the Identity & Time | |
if !bytes.Equal(le.observedRawRecord, oldLeaderElectionRawRecord) { | |
le.setObservedRecord(oldLeaderElectionRecord) | |
le.observedRawRecord = oldLeaderElectionRawRecord | |
} | |
if len(oldLeaderElectionRecord.HolderIdentity) > 0 && | |
le.observedTime.Add(le.config.LeaseDuration).After(now.Time) && | |
!le.IsLeader() { | |
klog.V(4).Infof("lock is held by %v and has not yet expired", oldLeaderElectionRecord.HolderIdentity) | |
return false | |
} | |
// 3. We're going to try to update. The leaderElectionRecord is set to it's default | |
// here. Let's correct it before updating. | |
if le.IsLeader() { | |
leaderElectionRecord.AcquireTime = oldLeaderElectionRecord.AcquireTime | |
leaderElectionRecord.LeaderTransitions = oldLeaderElectionRecord.LeaderTransitions | |
} else { | |
leaderElectionRecord.LeaderTransitions = oldLeaderElectionRecord.LeaderTransitions + 1 | |
} | |
// update the lock itself | |
if err = le.config.Lock.Update(ctx, leaderElectionRecord); err != nil { | |
klog.Errorf("Failed to update lock: %v", err) | |
return false | |
} | |
le.setObservedRecord(&leaderElectionRecord) | |
return true | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment