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 022b507dbc fix(register): clean up exhausted failback retries (#7084)
022b507dbc is described below

commit 022b507dbc735148ba035cf52e22a793dd6c4f2c
Author: Liming Deng <[email protected]>
AuthorDate: Wed Sep 30 09:57:20 2026 +0800

    fix(register): clean up exhausted failback retries (#7084)
---
 .../shenyu/common/timer/AbstractRetryTask.java     |  9 ++++++++
 .../client/api/retry/FailureRegistryTask.java      |  5 +++++
 .../client/api/retry/FailureRegistryTaskTest.java  | 25 ++++++++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/timer/AbstractRetryTask.java
 
b/shenyu-common/src/main/java/org/apache/shenyu/common/timer/AbstractRetryTask.java
index bfba49b040..7dcf104ef9 100644
--- 
a/shenyu-common/src/main/java/org/apache/shenyu/common/timer/AbstractRetryTask.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/timer/AbstractRetryTask.java
@@ -106,6 +106,7 @@ public abstract class AbstractRetryTask extends TimerTask {
         }
         if (!retryLimit && tickCount > retryCount) {
             logger.warn("Final failed to execute task, key:{}, retried:{}, 
task over.", key, tickCount);
+            this.onRetryExhausted(key);
             return;
         }
         try {
@@ -123,5 +124,13 @@ public abstract class AbstractRetryTask extends TimerTask {
      * @param timerTask the timer task
      */
     protected abstract void doRetry(String key, TimerTask timerTask);
+
+    /**
+     * Handle retry exhaustion.
+     *
+     * @param key the key
+     */
+    protected void onRetryExhausted(final String key) {
+    }
     
 }
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/main/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTask.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/main/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTask.java
index 6d0215ed57..7d173c377d 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/main/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTask.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/main/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTask.java
@@ -56,4 +56,9 @@ public class FailureRegistryTask extends AbstractRetryTask {
         //Because accept requires an exception to be thrown. Only normal can 
remove.
         this.registerRepository.remove(key);
     }
+
+    @Override
+    protected void onRetryExhausted(final String key) {
+        this.registerRepository.remove(key);
+    }
 }
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/test/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTaskTest.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/test/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTaskTest.java
index 594fcaa125..91fecc31ba 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/test/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTaskTest.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-api/src/test/java/org/apache/shenyu/register/client/api/retry/FailureRegistryTaskTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.shenyu.register.client.api.retry;
 
+import org.apache.shenyu.common.timer.TaskEntity;
+import org.apache.shenyu.common.timer.Timer;
 import org.apache.shenyu.common.timer.TimerTask;
 import org.apache.shenyu.register.client.api.FailbackRegistryRepository;
 import org.apache.shenyu.register.common.dto.ApiDocRegisterDTO;
@@ -31,8 +33,10 @@ import org.mockito.MockitoAnnotations;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 /**
  * Test case for {@link FailureRegistryTask}.
@@ -47,6 +51,12 @@ public final class FailureRegistryTaskTest {
     @Mock
     private TimerTask mockTimerTask;
 
+    @Mock
+    private TaskEntity mockTaskEntity;
+
+    @Mock
+    private Timer mockTimer;
+
     private FailureRegistryTask failureRegistryTask;
 
     @BeforeEach
@@ -95,6 +105,21 @@ public final class FailureRegistryTaskTest {
         verify(mockRepository, times(3)).remove(TEST_KEY);
     }
 
+    @Test
+    public void testRemoveAfterRetriesExhausted() {
+        when(mockTaskEntity.getTimer()).thenReturn(mockTimer);
+        when(mockTaskEntity.getTimerTask()).thenReturn(mockTimerTask);
+        doThrow(new IllegalStateException("registration 
failed")).when(mockRepository).accept(TEST_KEY);
+
+        for (int i = 0; i < 19; i++) {
+            failureRegistryTask.run(mockTaskEntity);
+        }
+
+        verify(mockRepository, times(18)).accept(TEST_KEY);
+        verify(mockRepository).remove(TEST_KEY);
+        verify(mockTimer, times(18)).add(mockTimerTask);
+    }
+
     @Test
     public void testDifferentKeys() {
         final String key1 = "key1";

Reply via email to