Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,13 @@ 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(
REGISTRY_FAILED_REFRESH_ADDRESS,
"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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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<Object> 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<String> serviceNames = new HashSet<>();
serviceNames.add("app1");
Expand Down
Loading