@@ -26,6 +26,7 @@ import (
26
26
"k8s.io/apimachinery/pkg/api/errors"
27
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
28
"k8s.io/apimachinery/pkg/labels"
29
+ "k8s.io/apimachinery/pkg/runtime/schema"
29
30
"k8s.io/apimachinery/pkg/util/sets"
30
31
metadataclient "k8s.io/client-go/metadata"
31
32
"k8s.io/client-go/metadata/metadatainformer"
@@ -152,37 +153,47 @@ func (n *nfdGarbageCollector) garbageCollect() {
152
153
nodeNames .Insert (meta .Name )
153
154
}
154
155
155
- // Handle NodeFeature objects
156
- objMetas , err := n .client .Resource (gvrNF ).List (context .TODO (), metav1.ListOptions {})
157
- if errors .IsNotFound (err ) {
158
- klog .V (2 ).InfoS ("NodeFeature CRD does not exist" )
159
- } else if err != nil {
160
- klog .ErrorS (err , "failed to list NodeFeature objects" )
161
- } else {
162
- for _ , nf := range objMetas .Items {
163
- nodeName , ok := nf .GetLabels ()[nfdv1alpha1 .NodeFeatureObjNodeNameLabel ]
164
- if ! ok {
165
- klog .InfoS ("node name label missing from NodeFeature object" , "nodefeature" , klog .KObj (& nf ))
156
+ listAndHandle := func (gvr schema.GroupVersionResource , handler func (metav1.PartialObjectMetadata )) {
157
+ opts := metav1.ListOptions {
158
+ Limit : 200 ,
159
+ }
160
+ for {
161
+ rsp , err := n .client .Resource (gvr ).List (context .TODO (), opts )
162
+ if errors .IsNotFound (err ) {
163
+ klog .V (2 ).InfoS ("resource does not exist" , "resource" , gvr )
164
+ break
165
+ } else if err != nil {
166
+ klog .ErrorS (err , "failed to list objects" , "resource" , gvr )
167
+ break
166
168
}
167
- if ! nodeNames . Has ( nodeName ) {
168
- n . deleteNodeFeature ( nf . Namespace , nf . Name )
169
+ for _ , item := range rsp . Items {
170
+ handler ( item )
169
171
}
172
+
173
+ if rsp .ListMeta .Continue == "" {
174
+ break
175
+ }
176
+ opts .Continue = rsp .ListMeta .Continue
170
177
}
171
178
}
172
179
180
+ // Handle NodeFeature objects
181
+ listAndHandle (gvrNF , func (meta metav1.PartialObjectMetadata ) {
182
+ nodeName , ok := meta .GetLabels ()[nfdv1alpha1 .NodeFeatureObjNodeNameLabel ]
183
+ if ! ok {
184
+ klog .InfoS ("node name label missing from NodeFeature object" , "nodefeature" , klog .KObj (& meta ))
185
+ }
186
+ if ! nodeNames .Has (nodeName ) {
187
+ n .deleteNodeFeature (meta .Namespace , meta .Name )
188
+ }
189
+ })
190
+
173
191
// Handle NodeResourceTopology objects
174
- objMetas , err = n .client .Resource (gvrNRT ).List (context .TODO (), metav1.ListOptions {})
175
- if errors .IsNotFound (err ) {
176
- klog .V (2 ).InfoS ("NodeResourceTopology CRD does not exist" )
177
- } else if err != nil {
178
- klog .ErrorS (err , "failed to list NodeResourceTopology objects" )
179
- } else {
180
- for _ , nrt := range objMetas .Items {
181
- if ! nodeNames .Has (nrt .Name ) {
182
- n .deleteNRT (nrt .Name )
183
- }
192
+ listAndHandle (gvrNRT , func (meta metav1.PartialObjectMetadata ) {
193
+ if ! nodeNames .Has (meta .Name ) {
194
+ n .deleteNRT (meta .Name )
184
195
}
185
- }
196
+ })
186
197
}
187
198
188
199
// periodicGC runs garbage collector at every gcPeriod to make sure we haven't missed any node
0 commit comments