Skip to content

Commit 4abfff9

Browse files
committed
fix: keep stale addresses refreshed on metadata failure (#16375)
1 parent 3a30432 commit 4abfff9

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,13 @@ private synchronized void doOnEvent(ServiceInstancesChangedEvent event) {
185185
int emptyNum = hasEmptyMetadata(revisionToInstances);
186186
if (emptyNum != 0) {
187187
hasEmptyMetadata = true;
188-
189-
// return if all metadata is empty, this notification will not take effect.
190188
if (emptyNum == revisionToInstances.size()) {
191189
// 1-17 - Address refresh failed.
192190
logger.error(
193191
REGISTRY_FAILED_REFRESH_ADDRESS,
194192
"metadata Server failure",
195193
"",
196194
"Address refresh failed because of Metadata Server failure, wait for retry or new address refresh event.");
197-
198-
submitRetryTask(event);
199-
return;
200195
}
201196
} else {
202197
hasEmptyMetadata = false;

dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,9 +679,35 @@ public MetadataInfo answer(InvocationOnMock invocationOnMock) throws Throwable {
679679
Assertions.assertEquals(2, serviceUrls2_after_retry.size());
680680
}
681681

682-
// Abnormal case. Instance does not have revision
682+
// revision 异常场景。某个应用先正常上报,再次通知时 metadata 全失败,旧地址应被清理掉
683683
@Test
684684
@Order(12)
685+
public void testRevisionFailureClearsStaleAddresses() {
686+
Set<String> serviceNames = new HashSet<>();
687+
serviceNames.add("app2");
688+
listener = new ServiceInstancesChangedListener(serviceNames, serviceDiscovery);
689+
690+
ServiceInstancesChangedEvent successEvent = new ServiceInstancesChangedEvent("app2", app1FailedInstances2);
691+
listener.onEvent(successEvent);
692+
693+
ProtocolServiceKey protocolServiceKey2 = new ProtocolServiceKey(service2, null, null, "dubbo");
694+
Assertions.assertEquals(
695+
2, listener.getAddresses(protocolServiceKey2, consumerURL).size());
696+
697+
when(serviceDiscovery.getRemoteMetadata(eq("222"), anyList())).thenReturn(MetadataInfo.EMPTY);
698+
List<Object> urlsFailedRevision2 = new ArrayList<>();
699+
urlsFailedRevision2.add("30.10.0.1:20880?revision=222");
700+
urlsFailedRevision2.add("30.10.0.2:20880?revision=222");
701+
ServiceInstancesChangedEvent failedEvent =
702+
new ServiceInstancesChangedEvent("app2", buildInstances(urlsFailedRevision2));
703+
listener.onEvent(failedEvent);
704+
705+
assertTrue(isEmpty(listener.getAddresses(protocolServiceKey2, consumerURL)));
706+
}
707+
708+
// Abnormal case. Instance does not have revision
709+
@Test
710+
@Order(13)
685711
public void testInstanceWithoutRevision() {
686712
Set<String> serviceNames = new HashSet<>();
687713
serviceNames.add("app1");

0 commit comments

Comments
 (0)