@@ -24,6 +24,11 @@ import (
2424 "k8s.io/klog/v2"
2525)
2626
27+ type nodeMeta struct {
28+ apiVersion , kind string
29+ cluster , namespace , name string
30+ }
31+
2732var _ cache.ResourceEventHandler = & nodeStorage {}
2833
2934func (s * nodeStorage ) OnAdd (obj interface {}) {
@@ -63,23 +68,40 @@ func (s *nodeStorage) OnUpdate(oldObj, newObj interface{}) {
6368 return
6469 }
6570
66- var resolvedRelations []ResourceRelation
71+ var resolvedLabelRelations []ResourceRelation
72+ resolvedDirectRelations := make (map [nodeMeta ]interface {})
6773 for _ , resolver := range s .resolvers {
6874 relations := resolver .Resolve (newTopoObj )
69- resolvedRelations = append (resolvedRelations , relations ... )
75+ for _ , relation := range relations {
76+ if relation .LabelSelector != nil {
77+ resolvedLabelRelations = append (resolvedLabelRelations , relation )
78+ } else {
79+ for _ , directRef := range relation .DirectRefs {
80+ resolvedDirectRelations [nodeMeta {
81+ apiVersion : relation .PostMeta .APIVersion ,
82+ kind : relation .PostMeta .Kind ,
83+ cluster : relation .Cluster ,
84+ namespace : directRef .Namespace ,
85+ name : directRef .Name ,
86+ }] = nil
87+ }
88+ }
89+ }
7090 }
7191
72- slices .SortFunc (resolvedRelations , compareResourceRelation )
92+ slices .SortFunc (resolvedLabelRelations , compareLabelResourceRelation )
7393 node .relationsLock .Lock ()
74- sortedSlicesCompare (node .relations , resolvedRelations ,
94+ sortedSlicesCompare (node .labelRelations , resolvedLabelRelations ,
7595 func (relation ResourceRelation ) {
76- s .removeResourceRelation (node , & relation )
96+ s .removeLabelResourceRelation (node , & relation )
7797 },
7898 func (relation ResourceRelation ) {
79- s .addResourceRelation (node , & relation )
99+ s .addLabelResourceRelation (node , & relation )
80100 },
81- compareResourceRelation )
82- node .relations = resolvedRelations
101+ compareLabelResourceRelation )
102+ node .labelRelations = resolvedLabelRelations
103+
104+ s .setDirectResourceRelation (node , resolvedDirectRelations )
83105 node .relationsLock .Unlock ()
84106
85107 if ! node .labelEqualed (newTopoObj .GetLabels ()) ||
@@ -132,7 +154,6 @@ func (s *nodeStorage) OnDelete(obj interface{}) {
132154 return
133155 }
134156
135- node .objectDeleted ()
136157 deleteAllRelation (node )
137158 node .checkGC ()
138159
@@ -142,18 +163,24 @@ func (s *nodeStorage) OnDelete(obj interface{}) {
142163
143164func (s * nodeStorage ) addNode (obj Object , node * nodeInfo ) {
144165 node .updateNodeMeta (obj )
145- if len (node .relations ) != 0 {
146- klog .Warningf ("unexpected relations {%v}" , node .relations )
147- node .relations = nil
166+ if len (node .labelRelations ) != 0 {
167+ klog .Warningf ("unexpected labelRelations {%v}" , node .labelRelations )
168+ node .labelRelations = nil
148169 }
149170 node .relationsLock .Lock ()
150171 for _ , resolver := range s .resolvers {
151172 relations := resolver .Resolve (obj )
152- node .relations = append (node .relations , relations ... )
173+ for _ , relation := range relations {
174+ if relation .LabelSelector != nil {
175+ node .labelRelations = append (node .labelRelations , relation )
176+ } else {
177+ s .addDirectResourceRelation (node , & relation )
178+ }
179+ }
153180 }
154- slices .SortFunc (node .relations , compareResourceRelation )
155- for _ , relation := range node .relations {
156- s .addResourceRelation (node , & relation )
181+ slices .SortFunc (node .labelRelations , compareLabelResourceRelation )
182+ for _ , relation := range node .labelRelations {
183+ s .addLabelResourceRelation (node , & relation )
157184 }
158185 node .relationsLock .Unlock ()
159186
@@ -171,20 +198,14 @@ func (s *nodeStorage) addNode(obj Object, node *nodeInfo) {
171198 }
172199}
173200
174- func (s * nodeStorage ) addResourceRelation (node * nodeInfo , relation * ResourceRelation ) {
201+ func (s * nodeStorage ) addLabelResourceRelation (node * nodeInfo , relation * ResourceRelation ) {
175202 postMeta := relation .PostMeta
176203 postMetaKey := generateMetaKey (postMeta )
177204 postStorage := s .manager .getStorage (postMeta )
178205 if postStorage == nil {
179206 klog .Errorf ("Failed to get node storage by meta %s, ignore this relation" , postMetaKey )
180207 return
181208 }
182- if len (relation .DirectRefs ) > 0 {
183- for _ , ref := range relation .DirectRefs {
184- postNode := postStorage .getOrCreateNode (relation .Cluster , ref .Namespace , ref .Name )
185- rangeAndSetDirectRefRelation (node , postNode , s .manager )
186- }
187- }
188209
189210 if relation .LabelSelector != nil {
190211 var postNodes []* nodeInfo
@@ -199,22 +220,65 @@ func (s *nodeStorage) addResourceRelation(node *nodeInfo, relation *ResourceRela
199220 }
200221}
201222
202- func (s * nodeStorage ) removeResourceRelation (node * nodeInfo , relation * ResourceRelation ) {
203- postStorage := s .manager .getStorage (relation .PostMeta )
223+ func (s * nodeStorage ) setDirectResourceRelation (node * nodeInfo , directRefs map [nodeMeta ]interface {}) {
224+ var toDel []* nodeInfo
225+ rangeNodeList (node .directReferredPostOrders , func (postNode * nodeInfo ) {
226+ postNodeMeta := nodeMeta {
227+ apiVersion : postNode .storageRef .meta .APIVersion ,
228+ kind : postNode .storageRef .meta .Kind ,
229+ cluster : postNode .cluster ,
230+ namespace : postNode .namespace ,
231+ name : postNode .name ,
232+ }
233+ if _ , ok := directRefs [postNodeMeta ]; ! ok {
234+ toDel = append (toDel , postNode )
235+ } else {
236+ delete (directRefs , postNodeMeta )
237+ }
238+ })
239+
240+ for _ , postNode := range toDel {
241+ if deleteDirectRelation (node , postNode ) {
242+ node .noticePostOrderRelationDeleted (postNode )
243+ postNode .checkGC ()
244+ }
245+ }
246+
247+ for postNodeMeta := range directRefs {
248+ postStorage := s .manager .getStorage (metav1.TypeMeta {APIVersion : postNodeMeta .apiVersion , Kind : postNodeMeta .kind })
249+ if postStorage == nil {
250+ klog .Errorf ("Failed to get node storage by meta %s, ignore this relation" , generateKey (postNodeMeta .apiVersion , postNodeMeta .kind ))
251+ continue
252+ }
253+ postNode := postStorage .getOrCreateNode (postNodeMeta .cluster , postNodeMeta .namespace , postNodeMeta .name )
254+ rangeAndSetDirectRefRelation (node , postNode , s .manager )
255+ }
256+ }
257+
258+ func (s * nodeStorage ) addDirectResourceRelation (node * nodeInfo , relation * ResourceRelation ) {
259+ postMeta := relation .PostMeta
260+ postMetaKey := generateMetaKey (postMeta )
261+ postStorage := s .manager .getStorage (postMeta )
204262 if postStorage == nil {
205- klog .Error ("Failed to get node Storage by %s, ignore this delete request" ,
206- generateMetaKey (relation .PostMeta ))
263+ klog .Errorf ("Failed to get node storage by meta %s, ignore this relation" , postMetaKey )
207264 return
208265 }
266+
209267 if len (relation .DirectRefs ) > 0 {
210268 for _ , ref := range relation .DirectRefs {
211- postNode := postStorage .getNode (relation .Cluster , ref .Namespace , ref .Name )
212- if deleteDirectRelation (node , postNode ) {
213- node .noticePostOrderRelationDeleted (postNode )
214- postNode .checkGC ()
215- }
269+ postNode := postStorage .getOrCreateNode (relation .Cluster , ref .Namespace , ref .Name )
270+ rangeAndSetDirectRefRelation (node , postNode , s .manager )
216271 }
217272 }
273+ }
274+
275+ func (s * nodeStorage ) removeLabelResourceRelation (node * nodeInfo , relation * ResourceRelation ) {
276+ postStorage := s .manager .getStorage (relation .PostMeta )
277+ if postStorage == nil {
278+ klog .Error ("Failed to get node Storage by %s, ignore this delete request" ,
279+ generateMetaKey (relation .PostMeta ))
280+ return
281+ }
218282
219283 if relation .LabelSelector != nil {
220284 postNodes := postStorage .getMatchedNodeList (node .cluster , node .namespace , relation .LabelSelector )
0 commit comments