@@ -337,13 +337,26 @@ func (d *ResourceDetector) OnUpdate(oldObj, newObj interface{}) {
337337 return
338338 }
339339
340- resourceChangeByKarmada := eventfilter .ResourceChangeByKarmada (unstructuredOldObj , unstructuredNewObj )
340+ isLazyActivation , err := d .isClaimedByLazyPolicy (unstructuredNewObj )
341+ if err != nil {
342+ // should never come here
343+ klog .Errorf ("Failed to check if the object (kind=%s, %s/%s) is bound by lazy policy. err: %v" , unstructuredNewObj .GetKind (), unstructuredNewObj .GetNamespace (), unstructuredNewObj .GetName (), err )
344+ }
341345
342- resourceItem := ResourceItem {
343- Obj : newRuntimeObj ,
344- ResourceChangeByKarmada : resourceChangeByKarmada ,
346+ if isLazyActivation {
347+ resourceItem := ResourceItem {
348+ Obj : newRuntimeObj ,
349+ ResourceChangeByKarmada : eventfilter .ResourceChangeByKarmada (unstructuredOldObj , unstructuredNewObj ),
350+ }
351+
352+ d .Processor .Enqueue (resourceItem )
353+ return
345354 }
346355
356+ // For non-lazy policies, it is no need to distinguish whether the change is from Karmada or not.
357+ resourceItem := ResourceItem {
358+ Obj : newRuntimeObj ,
359+ }
347360 d .Processor .Enqueue (resourceItem )
348361}
349362
@@ -1228,7 +1241,7 @@ func (d *ResourceDetector) HandlePropagationPolicyCreationOrUpdate(policy *polic
12281241 if err != nil {
12291242 return err
12301243 }
1231- d .Processor . Add (keys. ClusterWideKeyWithConfig { ClusterWideKey : resourceKey , ResourceChangeByKarmada : true } )
1244+ d .enqueueResourceTemplateForPolicyChange ( resourceKey , policy . Spec . ActivationPreference )
12321245 }
12331246
12341247 // check whether there are matched RT in waiting list, is so, add it to processor
@@ -1246,7 +1259,7 @@ func (d *ResourceDetector) HandlePropagationPolicyCreationOrUpdate(policy *polic
12461259
12471260 for _ , key := range matchedKeys {
12481261 d .RemoveWaiting (key )
1249- d .Processor . Add (keys. ClusterWideKeyWithConfig { ClusterWideKey : key , ResourceChangeByKarmada : true } )
1262+ d .enqueueResourceTemplateForPolicyChange ( key , policy . Spec . ActivationPreference )
12501263 }
12511264
12521265 // If preemption is enabled, handle the preemption process.
@@ -1295,14 +1308,14 @@ func (d *ResourceDetector) HandleClusterPropagationPolicyCreationOrUpdate(policy
12951308 if err != nil {
12961309 return err
12971310 }
1298- d .Processor . Add (keys. ClusterWideKeyWithConfig { ClusterWideKey : resourceKey , ResourceChangeByKarmada : true } )
1311+ d .enqueueResourceTemplateForPolicyChange ( resourceKey , policy . Spec . ActivationPreference )
12991312 }
13001313 for _ , crb := range clusterResourceBindings .Items {
13011314 resourceKey , err := helper .ConstructClusterWideKey (crb .Spec .Resource )
13021315 if err != nil {
13031316 return err
13041317 }
1305- d .Processor . Add (keys. ClusterWideKeyWithConfig { ClusterWideKey : resourceKey , ResourceChangeByKarmada : true } )
1318+ d .enqueueResourceTemplateForPolicyChange ( resourceKey , policy . Spec . ActivationPreference )
13061319 }
13071320
13081321 matchedKeys := d .GetMatching (policy .Spec .ResourceSelectors )
@@ -1319,7 +1332,7 @@ func (d *ResourceDetector) HandleClusterPropagationPolicyCreationOrUpdate(policy
13191332
13201333 for _ , key := range matchedKeys {
13211334 d .RemoveWaiting (key )
1322- d .Processor . Add (keys. ClusterWideKeyWithConfig { ClusterWideKey : key , ResourceChangeByKarmada : true } )
1335+ d .enqueueResourceTemplateForPolicyChange ( key , policy . Spec . ActivationPreference )
13231336 }
13241337
13251338 // If preemption is enabled, handle the preemption process.
@@ -1462,3 +1475,21 @@ func (d *ResourceDetector) CleanupClusterResourceBindingClaimMetadata(crbName st
14621475 return updateErr
14631476 })
14641477}
1478+
1479+ // enqueueResourceTemplateForPolicyChange enqueues a resource template key for reconciliation in response to a
1480+ // PropagationPolicy or ClusterPropagationPolicy change. If the policy's ActivationPreference is set to Lazy,
1481+ // the ResourceChangeByKarmada flag is set to true, indicating that the resource template is being enqueued
1482+ // due to a policy change and should not be propagated to member clusters. For non-lazy policies, this flag
1483+ // is omitted as the distinction is unnecessary.
1484+ //
1485+ // Note: Setting ResourceChangeByKarmada changes the effective queue key. Mixing both true/false for the same
1486+ // resource may result in two different queue keys being processed concurrently, which can cause race conditions.
1487+ // Therefore, only set ResourceChangeByKarmada in lazy activation mode.
1488+ // For more details, see: https://github.com/karmada-io/karmada/issues/5996.
1489+ func (d * ResourceDetector ) enqueueResourceTemplateForPolicyChange (key keys.ClusterWideKey , pref policyv1alpha1.ActivationPreference ) {
1490+ if util .IsLazyActivationEnabled (pref ) {
1491+ d .Processor .Add (keys.ClusterWideKeyWithConfig {ClusterWideKey : key , ResourceChangeByKarmada : true })
1492+ return
1493+ }
1494+ d .Processor .Add (keys.ClusterWideKeyWithConfig {ClusterWideKey : key })
1495+ }
0 commit comments