Skip to content

Commit d38cc16

Browse files
fix: add nil checks to prevent panics in leaderelection
- Add nil checks for callback functions (OnStartedLeading/OnStoppedLeading) - Add nil checks for lease pointer in isHolderOf method - Add nil checks for observedLease and LeaseDurationSeconds in isLeaseValid method - Prevents runtime panics when callbacks are not provided or lease fields are nil This change improves robustness by adding defensive nil checks throughout the leaderelection code, particularly for callback functions that may not always be provided and for lease object fields that could be nil.
1 parent c79824a commit d38cc16

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

pkg/util/leaderelection/leaderelection.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (m *leaderManager) onAdd(obj any) {
116116

117117
m.setObservedRecord(lease)
118118
// Notify if we are the leader from the very begging
119-
if m.isHolderOf(lease) {
119+
if m.isHolderOf(lease) && m.callbacks.OnStartedLeading != nil {
120120
m.callbacks.OnStartedLeading()
121121
}
122122
}
@@ -138,9 +138,13 @@ func (m *leaderManager) onUpdate(oldObj, newObj any) {
138138

139139
// Notify if we have been elected to become the leader
140140
if !m.isHolderOf(oldLease) && m.isHolderOf(newLease) {
141-
m.callbacks.OnStartedLeading()
141+
if m.callbacks.OnStartedLeading != nil {
142+
m.callbacks.OnStartedLeading()
143+
}
142144
} else if m.isHolderOf(oldLease) && !m.isHolderOf(newLease) {
143-
m.callbacks.OnStoppedLeading()
145+
if m.callbacks.OnStoppedLeading != nil {
146+
m.callbacks.OnStoppedLeading()
147+
}
144148
}
145149
}
146150

@@ -150,15 +154,23 @@ func (m *leaderManager) onDelete(obj any) {
150154
defer m.leaseLock.Unlock()
151155

152156
m.setObservedRecord(nil)
153-
m.callbacks.OnStoppedLeading()
157+
if m.callbacks.OnStoppedLeading != nil {
158+
m.callbacks.OnStoppedLeading()
159+
}
154160
}
155161

156162
func (m *leaderManager) isHolderOf(lease *coordinationv1.Lease) bool {
157163
// kube-scheduler lease id take format of `hostname + "_" + string(uuid.NewUUID())`
158-
return lease.Spec.HolderIdentity != nil && strings.HasPrefix(*lease.Spec.HolderIdentity, m.hostname)
164+
if lease == nil || lease.Spec.HolderIdentity == nil {
165+
return false
166+
}
167+
return strings.HasPrefix(*lease.Spec.HolderIdentity, m.hostname)
159168
}
160169

161170
func (m *leaderManager) isLeaseValid(now time.Time) bool {
171+
if m.observedLease == nil || m.observedLease.Spec.LeaseDurationSeconds == nil {
172+
return false
173+
}
162174
return m.observedTime.Add(time.Second * time.Duration(*m.observedLease.Spec.LeaseDurationSeconds)).After(now)
163175
}
164176

0 commit comments

Comments
 (0)