diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java index 6d3a254c6384..e85dabdef0b7 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java @@ -185,8 +185,6 @@ private synchronized void doOnEvent(ServiceInstancesChangedEvent event) { int emptyNum = hasEmptyMetadata(revisionToInstances); if (emptyNum != 0) { hasEmptyMetadata = true; - - // return if all metadata is empty, this notification will not take effect. if (emptyNum == revisionToInstances.size()) { // 1-17 - Address refresh failed. logger.error( @@ -194,9 +192,6 @@ private synchronized void doOnEvent(ServiceInstancesChangedEvent event) { "metadata Server failure", "", "Address refresh failed because of Metadata Server failure, wait for retry or new address refresh event."); - - submitRetryTask(event); - return; } } else { hasEmptyMetadata = false; diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java index 66a0376841ba..6bbc0115d4b7 100644 --- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java +++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java @@ -679,9 +679,36 @@ public MetadataInfo answer(InvocationOnMock invocationOnMock) throws Throwable { Assertions.assertEquals(2, serviceUrls2_after_retry.size()); } - // Abnormal case. Instance does not have revision + // Revision failure scenario: after a successful notification, a later one with all metadata lookups failed + // should clear stale addresses. @Test @Order(12) + public void testRevisionFailureClearsStaleAddresses() { + Set serviceNames = new HashSet<>(); + serviceNames.add("app2"); + listener = new ServiceInstancesChangedListener(serviceNames, serviceDiscovery); + + ServiceInstancesChangedEvent successEvent = new ServiceInstancesChangedEvent("app2", app1FailedInstances2); + listener.onEvent(successEvent); + + ProtocolServiceKey protocolServiceKey2 = new ProtocolServiceKey(service2, null, null, "dubbo"); + Assertions.assertEquals( + 2, listener.getAddresses(protocolServiceKey2, consumerURL).size()); + + when(serviceDiscovery.getRemoteMetadata(eq("222"), anyList())).thenReturn(MetadataInfo.EMPTY); + List urlsFailedRevision2 = new ArrayList<>(); + urlsFailedRevision2.add("30.10.0.1:20880?revision=222"); + urlsFailedRevision2.add("30.10.0.2:20880?revision=222"); + ServiceInstancesChangedEvent failedEvent = + new ServiceInstancesChangedEvent("app2", buildInstances(urlsFailedRevision2)); + listener.onEvent(failedEvent); + + assertTrue(isEmpty(listener.getAddresses(protocolServiceKey2, consumerURL))); + } + + // Abnormal case. Instance does not have revision + @Test + @Order(13) public void testInstanceWithoutRevision() { Set serviceNames = new HashSet<>(); serviceNames.add("app1");