From 366cd459d3b2ad0547a60d5cc085105ffc8a866d Mon Sep 17 00:00:00 2001 From: Slavik Panasovets Date: Fri, 22 Aug 2025 14:45:33 -0700 Subject: [PATCH] Fix deletion handling in NEG tests and service creation latency - Handle nil DeletionTimestamp gracefully by using current time when objects are deleted immediately without a deletion timestamp - Add explicit wait for ingress deletion in NEG test configuration to ensure all ingresses are fully removed before test completion - Remove incorrect warning logs that were preventing proper deletion tracking when DeletionTimestamp was nil These changes improve the reliability of NEG tests by properly tracking deletion phases even when Kubernetes performs immediate deletions, and ensuring proper cleanup sequencing. --- .../common/service_creation_latency.go | 20 ++++++++++--------- clusterloader2/testing/neg/config.yaml | 4 ++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/clusterloader2/pkg/measurement/common/service_creation_latency.go b/clusterloader2/pkg/measurement/common/service_creation_latency.go index 868f2cafe8..1f9e737861 100644 --- a/clusterloader2/pkg/measurement/common/service_creation_latency.go +++ b/clusterloader2/pkg/measurement/common/service_creation_latency.go @@ -337,7 +337,7 @@ func (s *serviceCreationLatencyMeasurement) handleIngressObject(oldObj, newObj i return } newIngress, ok = newObj.(*networkingv1.Ingress) - if newIngress != nil && !ok { + if newObj != nil && !ok { klog.Errorf("%s: uncastable new object: %v", s, newObj) return } @@ -369,11 +369,12 @@ func (s *serviceCreationLatencyMeasurement) deleteObject(svc *corev1.Service) er } s.lock.Lock() defer s.lock.Unlock() - if svc.ObjectMeta.DeletionTimestamp == nil { - klog.Warningf("DeletionTimestamp is nil for service: %v", key) - return nil + if svc.ObjectMeta.DeletionTimestamp != nil { + s.creationTimes.Set(key, phaseName(deletingPhase, svc.Spec.Type), svc.ObjectMeta.DeletionTimestamp.Time) + } else { + // Object was deleted without DeletionTimestamp (immediate deletion) + s.creationTimes.Set(key, phaseName(deletingPhase, svc.Spec.Type), time.Now()) } - s.creationTimes.Set(key, phaseName(deletingPhase, svc.Spec.Type), svc.ObjectMeta.DeletionTimestamp.Time) s.creationTimes.Set(key, phaseName(deletedPhase, svc.Spec.Type), time.Now()) s.pingCheckers.DeleteAndStop(key) return nil @@ -386,11 +387,12 @@ func (s *serviceCreationLatencyMeasurement) deleteIngressObject(ingress *network } s.lock.Lock() defer s.lock.Unlock() - if ingress.ObjectMeta.DeletionTimestamp == nil { - klog.Warningf("DeletionTimestamp is nil for service: %v", key) - return nil + if ingress.ObjectMeta.DeletionTimestamp != nil { + s.creationTimes.Set(key, phaseName(deletingPhase, ingressType), ingress.ObjectMeta.DeletionTimestamp.Time) + } else { + // Object was deleted without DeletionTimestamp (immediate deletion) + s.creationTimes.Set(key, phaseName(deletingPhase, ingressType), time.Now()) } - s.creationTimes.Set(key, phaseName(deletingPhase, ingressType), ingress.ObjectMeta.DeletionTimestamp.Time) s.creationTimes.Set(key, phaseName(deletedPhase, ingressType), time.Now()) s.pingCheckers.DeleteAndStop(key) return nil diff --git a/clusterloader2/testing/neg/config.yaml b/clusterloader2/testing/neg/config.yaml index 0998080d86..41fd7c38bc 100644 --- a/clusterloader2/testing/neg/config.yaml +++ b/clusterloader2/testing/neg/config.yaml @@ -119,6 +119,10 @@ steps: Method: WaitForControlledPodsRunning Params: action: gather +- module: + path: /modules/ingress-measurements.yaml + params: + action: waitForDeletion - name: Wait after deletion measurements: - Identifier: Wait