Skip to content

Commit 16bf740

Browse files
committed
fix(reflection): handle errors when getting metadata accessor
1 parent 525e6ef commit 16bf740

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

internal/crdReplicator/reflection/reflector.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,29 @@ func (r *Reflector) get(gvr schema.GroupVersionResource) (*reflectedResource, bo
247247
func (r *Reflector) eventHandlers(gvr schema.GroupVersionResource) cache.ResourceEventHandlerFuncs {
248248
eh := func(obj interface{}) {
249249
metadata, err := meta.Accessor(obj)
250-
utilruntime.Must(err)
250+
if err != nil {
251+
klog.Errorf("[%v] Failed to get metadata accessor for %v event handler: obj=%T, err=%v", r.remoteClusterID, gvr, obj, err)
252+
return
253+
}
251254

252255
r.workqueue.Add(item{gvr: gvr, name: metadata.GetName()})
253256
}
254257

258+
ehDelete := func(obj interface{}) {
259+
// Delete events may come wrapped in a tombstone; unwrap it if needed.
260+
switch tombstone := obj.(type) {
261+
case cache.DeletedFinalStateUnknown:
262+
obj = tombstone.Obj
263+
case *cache.DeletedFinalStateUnknown:
264+
obj = tombstone.Obj
265+
}
266+
eh(obj)
267+
}
268+
255269
return cache.ResourceEventHandlerFuncs{
256270
AddFunc: eh,
257271
UpdateFunc: func(_, obj interface{}) { eh(obj) },
258-
DeleteFunc: eh,
272+
DeleteFunc: ehDelete,
259273
}
260274
}
261275

pkg/virtualKubelet/reflection/generic/reflector.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"k8s.io/apimachinery/pkg/api/meta"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
"k8s.io/apimachinery/pkg/types"
28-
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2928
"k8s.io/apimachinery/pkg/util/wait"
3029
"k8s.io/apimachinery/pkg/watch"
3130
"k8s.io/client-go/tools/cache"
@@ -303,8 +302,24 @@ func (gr *reflector) handle(ctx context.Context, key types.NamespacedName) error
303302
// handle dispatches the items to be reconciled based on the resource type and namespace.
304303
func (gr *reflector) handlers(keyer options.Keyer, filters ...options.EventFilter) cache.ResourceEventHandler {
305304
eh := func(ev watch.EventType, obj interface{}) {
305+
// Unwrap tombstones for delete events. Informers may pass a
306+
// cache.DeletedFinalStateUnknown containing the last known object.
307+
if ev == watch.Deleted {
308+
switch tombstone := obj.(type) {
309+
case cache.DeletedFinalStateUnknown:
310+
obj = tombstone.Obj
311+
case *cache.DeletedFinalStateUnknown:
312+
obj = tombstone.Obj
313+
}
314+
}
315+
306316
metadata, err := meta.Accessor(obj)
307-
utilruntime.Must(err)
317+
if err != nil {
318+
// Do not panic: just log and skip this event.
319+
klog.Errorf("Failed to get metadata accessor in %v reflector for event %q: obj=%T, err=%v",
320+
gr.name, ev, obj, err)
321+
return
322+
}
308323

309324
for _, filter := range filters {
310325
if filter(ev) {

0 commit comments

Comments
 (0)