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";