Skip to content

Commit f63d8ca

Browse files
authored
[NPM] DeletedFinalStateUnknown check missed delete events (#785)
* adding better delete watch function logic
1 parent 230122f commit f63d8ca

File tree

1 file changed

+94
-9
lines changed

1 file changed

+94
-9
lines changed

npm/npm.go

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,18 +258,49 @@ func NewNetworkPolicyManager(clientset *kubernetes.Clientset, informerFactory in
258258
// Pod event handlers
259259
cache.ResourceEventHandlerFuncs{
260260
AddFunc: func(obj interface{}) {
261+
podObj, ok := obj.(*corev1.Pod)
262+
if !ok {
263+
metrics.SendErrorLogAndMetric(util.NpmID, "ADD Pod: Received unexpected object type: %v", obj)
264+
return
265+
}
261266
npMgr.Lock()
262-
npMgr.AddPod(obj.(*corev1.Pod))
267+
npMgr.AddPod(podObj)
263268
npMgr.Unlock()
264269
},
265270
UpdateFunc: func(old, new interface{}) {
271+
oldPodObj, ok := old.(*corev1.Pod)
272+
if !ok {
273+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE Pod: Received unexpected old object type: %v", oldPodObj)
274+
return
275+
}
276+
newPodObj, ok := new.(*corev1.Pod)
277+
if !ok {
278+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE Pod: Received unexpected new object type: %v", newPodObj)
279+
return
280+
}
266281
npMgr.Lock()
267-
npMgr.UpdatePod(old.(*corev1.Pod), new.(*corev1.Pod))
282+
npMgr.UpdatePod(oldPodObj, newPodObj)
268283
npMgr.Unlock()
269284
},
270285
DeleteFunc: func(obj interface{}) {
286+
// DeleteFunc gets the final state of the resource (if it is known).
287+
// Otherwise, it gets an object of type DeletedFinalStateUnknown.
288+
// This can happen if the watch is closed and misses the delete event and
289+
// the controller doesn't notice the deletion until the subsequent re-list
290+
podObj, ok := obj.(*corev1.Pod)
291+
if !ok {
292+
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
293+
if !ok {
294+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE Pod: Received unexpected object type: %v", obj)
295+
return
296+
}
297+
if podObj, ok = tombstone.Obj.(*corev1.Pod); !ok {
298+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE Pod: Received unexpected object type: %v", obj)
299+
return
300+
}
301+
}
271302
npMgr.Lock()
272-
npMgr.DeletePod(obj.(*corev1.Pod))
303+
npMgr.DeletePod(podObj)
273304
npMgr.Unlock()
274305
},
275306
},
@@ -279,18 +310,45 @@ func NewNetworkPolicyManager(clientset *kubernetes.Clientset, informerFactory in
279310
// Namespace event handlers
280311
cache.ResourceEventHandlerFuncs{
281312
AddFunc: func(obj interface{}) {
313+
nameSpaceObj, ok := obj.(*corev1.Namespace)
314+
if !ok {
315+
metrics.SendErrorLogAndMetric(util.NpmID, "ADD NameSpace: Received unexpected object type: %v", obj)
316+
return
317+
}
282318
npMgr.Lock()
283-
npMgr.AddNamespace(obj.(*corev1.Namespace))
319+
npMgr.AddNamespace(nameSpaceObj)
284320
npMgr.Unlock()
285321
},
286322
UpdateFunc: func(old, new interface{}) {
323+
oldNameSpaceObj, ok := old.(*corev1.Namespace)
324+
if !ok {
325+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE NameSpace: Received unexpected old object type: %v", oldNameSpaceObj)
326+
return
327+
}
328+
newNameSpaceObj, ok := new.(*corev1.Namespace)
329+
if !ok {
330+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE NameSpace: Received unexpected new object type: %v", newNameSpaceObj)
331+
return
332+
}
287333
npMgr.Lock()
288-
npMgr.UpdateNamespace(old.(*corev1.Namespace), new.(*corev1.Namespace))
334+
npMgr.UpdateNamespace(oldNameSpaceObj, newNameSpaceObj)
289335
npMgr.Unlock()
290336
},
291337
DeleteFunc: func(obj interface{}) {
338+
nameSpaceObj, ok := obj.(*corev1.Namespace)
339+
if !ok {
340+
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
341+
if !ok {
342+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE NameSpace: Received unexpected object type: %v", obj)
343+
return
344+
}
345+
if nameSpaceObj, ok = tombstone.Obj.(*corev1.Namespace); !ok {
346+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE NameSpace: Received unexpected object type: %v", obj)
347+
return
348+
}
349+
}
292350
npMgr.Lock()
293-
npMgr.DeleteNamespace(obj.(*corev1.Namespace))
351+
npMgr.DeleteNamespace(nameSpaceObj)
294352
npMgr.Unlock()
295353
},
296354
},
@@ -300,18 +358,45 @@ func NewNetworkPolicyManager(clientset *kubernetes.Clientset, informerFactory in
300358
// Network policy event handlers
301359
cache.ResourceEventHandlerFuncs{
302360
AddFunc: func(obj interface{}) {
361+
networkPolicyObj, ok := obj.(*networkingv1.NetworkPolicy)
362+
if !ok {
363+
metrics.SendErrorLogAndMetric(util.NpmID, "ADD Network Policy: Received unexpected object type: %v", obj)
364+
return
365+
}
303366
npMgr.Lock()
304-
npMgr.AddNetworkPolicy(obj.(*networkingv1.NetworkPolicy))
367+
npMgr.AddNetworkPolicy(networkPolicyObj)
305368
npMgr.Unlock()
306369
},
307370
UpdateFunc: func(old, new interface{}) {
371+
oldNetworkPolicyObj, ok := old.(*networkingv1.NetworkPolicy)
372+
if !ok {
373+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE Network Policy: Received unexpected old object type: %v", oldNetworkPolicyObj)
374+
return
375+
}
376+
newNetworkPolicyObj, ok := new.(*networkingv1.NetworkPolicy)
377+
if !ok {
378+
metrics.SendErrorLogAndMetric(util.NpmID, "UPDATE Network Policy: Received unexpected new object type: %v", newNetworkPolicyObj)
379+
return
380+
}
308381
npMgr.Lock()
309-
npMgr.UpdateNetworkPolicy(old.(*networkingv1.NetworkPolicy), new.(*networkingv1.NetworkPolicy))
382+
npMgr.UpdateNetworkPolicy(oldNetworkPolicyObj, newNetworkPolicyObj)
310383
npMgr.Unlock()
311384
},
312385
DeleteFunc: func(obj interface{}) {
386+
networkPolicyObj, ok := obj.(*networkingv1.NetworkPolicy)
387+
if !ok {
388+
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
389+
if !ok {
390+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE Network Policy: Received unexpected object type: %v", obj)
391+
return
392+
}
393+
if networkPolicyObj, ok = tombstone.Obj.(*networkingv1.NetworkPolicy); !ok {
394+
metrics.SendErrorLogAndMetric(util.NpmID, "DELETE Network Policy: Received unexpected object type: %v", obj)
395+
return
396+
}
397+
}
313398
npMgr.Lock()
314-
npMgr.DeleteNetworkPolicy(obj.(*networkingv1.NetworkPolicy))
399+
npMgr.DeleteNetworkPolicy(networkPolicyObj)
315400
npMgr.Unlock()
316401
},
317402
},

0 commit comments

Comments
 (0)