This is an automated email from the ASF dual-hosted git repository.

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new c1719cef13 fix: fix ingress deletion cleanup NPE (#6988)
c1719cef13 is described below

commit c1719cef13351dc4a9cfb4e0418514f3f2fa7049
Author: hengyuss <[email protected]>
AuthorDate: Fri Sep 4 18:04:35 2026 +0800

    fix: fix ingress deletion cleanup NPE (#6988)
    
    Co-authored-by: aias00 <[email protected]>
---
 .../shenyu/k8s/reconciler/IngressReconciler.java   |  4 +--
 .../shenyu/k8s/DivideIngressReconcilerTest.java    | 32 ++++++++++++++++++++--
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git 
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/reconciler/IngressReconciler.java
 
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/reconciler/IngressReconciler.java
index c47a93ef2e..ab461f8e18 100644
--- 
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/reconciler/IngressReconciler.java
+++ 
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/reconciler/IngressReconciler.java
@@ -133,8 +133,6 @@ public class IngressReconciler implements Reconciler {
         // Do not modify current ingress object directly
         final V1Ingress v1Ingress = 
this.ingressLister.namespace(request.getNamespace()).get(request.getName());
         final V1Ingress oldIngress = 
IngressCache.getInstance().get(request.getNamespace(), request.getName());
-        Map<String, String> annotations = 
v1Ingress.getMetadata().getAnnotations();
-        enablePluginsBasedOnAnnotations(annotations, request);
         if (Objects.isNull(v1Ingress)) {
             if (Objects.nonNull(oldIngress)) {
                 // Delete ingress binding selectors
@@ -160,6 +158,8 @@ public class IngressReconciler implements Reconciler {
             }
             return new Result(false);
         }
+        Map<String, String> annotations = 
v1Ingress.getMetadata().getAnnotations();
+        enablePluginsBasedOnAnnotations(annotations, request);
 
         if (!checkIngressClass(v1Ingress)) {
             LOG.info("IngressClass is not match {}", request);
diff --git 
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
 
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
index e23e92037e..c5e8430ed3 100644
--- 
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
+++ 
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
@@ -34,6 +34,10 @@ import 
io.kubernetes.client.openapi.models.V1EndpointsBuilder;
 import io.kubernetes.client.openapi.models.V1EndpointSubsetBuilder;
 import io.kubernetes.client.openapi.models.V1EndpointAddress;
 import org.apache.shenyu.common.config.ssl.ShenyuSniAsyncMapping;
+import org.apache.shenyu.common.enums.PluginEnum;
+import org.apache.shenyu.k8s.cache.IngressCache;
+import org.apache.shenyu.k8s.cache.IngressSelectorCache;
+import org.apache.shenyu.k8s.cache.ServiceIngressCache;
 import org.apache.shenyu.k8s.parser.IngressParser;
 import org.apache.shenyu.k8s.reconciler.IngressReconciler;
 import org.apache.shenyu.k8s.repository.ShenyuCacheRepository;
@@ -41,13 +45,16 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.when;
 
 /**
  * Divide Ingress Reconciler Test.
@@ -119,4 +126,25 @@ public final class DivideIngressReconcilerTest {
         verify(shenyuCacheRepository).saveOrUpdateSelectorData(any());
         verify(shenyuCacheRepository).saveOrUpdateRuleData(any());
     }
+
+    /**
+     * Test reconcile after ingress deletion.
+     */
+    @Test
+    public void testReconcileDeletedIngress() {
+        Result result = ingressReconciler.reconcile(new 
Request("mockedNamespace", "mockedIngress"));
+        Assertions.assertEquals(new Result(false), result);
+        
when(ingressInformer.getIndexer().getByKey("mockedNamespace/mockedIngress")).thenReturn(null);
+        
when(shenyuCacheRepository.findRuleDataList(anyString())).thenReturn(Collections.emptyList());
+
+        result = Assertions.assertDoesNotThrow(
+                () -> ingressReconciler.reconcile(new 
Request("mockedNamespace", "mockedIngress")));
+
+        Assertions.assertEquals(new Result(false), result);
+        
Assertions.assertNull(IngressCache.getInstance().get("mockedNamespace", 
"mockedIngress"));
+        Assertions.assertNull(IngressSelectorCache.getInstance().get(
+                "mockedNamespace", "mockedIngress", 
PluginEnum.DIVIDE.getName()));
+        
Assertions.assertTrue(ServiceIngressCache.getInstance().getIngressName("mockedNamespace",
 "testService").isEmpty());
+        
verify(shenyuCacheRepository).deleteSelectorData(eq(PluginEnum.DIVIDE.getName()),
 anyString());
+    }
 }

Reply via email to