[SCB-2621]fix problem of discovery will stop due to list concurrent m… (#3154)
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
index 75e8afc..1e099e0 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
@@ -138,7 +138,7 @@
try {
valueType = ValueType.valueOf(kvDoc.getValueType());
} catch (IllegalArgumentException e) {
- throw new OperationException("value type not support");
+ throw new OperationException("value type not support [" + kvDoc.getValue() + "]");
}
Properties properties = new Properties();
Map<String, Object> kvMap = new HashMap<>();
@@ -159,7 +159,7 @@
return kvMap;
}
} catch (Exception e) {
- LOGGER.error("read config failed");
+ LOGGER.error("read config failed", e);
}
return Collections.emptyMap();
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index c28af01..6406325 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -82,7 +82,7 @@
List<MicroserviceInstance> instancesCache;
}
- private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCenterRegistration.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCenterDiscovery.class);
private final ServiceCenterClient serviceCenterClient;
@@ -92,8 +92,6 @@
private final Map<SubscriptionKey, SubscriptionValue> instancesCache = new ConcurrentHashMap<>();
- private final List<SubscriptionKey> failedInstances = new ArrayList<>();
-
private final Map<String, Microservice> microserviceCache = new ConcurrentHashMap<>();
private long pollInterval = 15000;
@@ -133,7 +131,7 @@
synchronized (lock) {
if (this.instancesCache.get(subscriptionKey) == null) {
SubscriptionValue value = new SubscriptionValue();
- pullInstance(subscriptionKey, value);
+ pullInstance(subscriptionKey, value, false);
this.instancesCache.put(subscriptionKey, value);
}
}
@@ -154,11 +152,13 @@
startTask(new PullInstanceOnceTask());
}
- private void pullInstance(SubscriptionKey k, SubscriptionValue v) {
+ private List<SubscriptionKey> pullInstance(SubscriptionKey k, SubscriptionValue v, boolean sendChangedEvent) {
if (myselfServiceId == null) {
// registration not ready
- return;
+ return Collections.emptyList();
}
+
+ List<SubscriptionKey> failedKeys = new ArrayList<>();
try {
FindMicroserviceInstancesResponse instancesResponse = serviceCenterClient
.findMicroserviceInstance(myselfServiceId, k.appId, k.serviceName, ALL_VERSION, v.revision);
@@ -179,13 +179,16 @@
);
v.instancesCache = instances;
v.revision = instancesResponse.getRevision();
- eventBus.post(new InstanceChangedEvent(k.appId, k.serviceName,
- v.instancesCache));
+ if (sendChangedEvent) {
+ eventBus.post(new InstanceChangedEvent(k.appId, k.serviceName,
+ v.instancesCache));
+ }
}
} catch (Exception e) {
LOGGER.error("find service {}#{} instance failed.", k.appId, k.serviceName, e);
- failedInstances.add(k);
+ failedKeys.add(k);
}
+ return failedKeys;
}
private void setMicroserviceInfo(List<MicroserviceInstance> instances) {
@@ -224,7 +227,8 @@
}
private synchronized void pullAllInstance() {
- instancesCache.forEach(this::pullInstance);
+ List<SubscriptionKey> failedInstances = new ArrayList<>();
+ instancesCache.forEach((k, v) -> failedInstances.addAll(pullInstance(k, v, true)));
if (failedInstances.isEmpty()) {
return;
}
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
index 3f54cfe..9fff0cf 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
+++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
@@ -29,7 +29,6 @@
import org.apache.servicecomb.http.client.auth.DefaultRequestAuthHeaderProvider;
import org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
import org.apache.servicecomb.service.center.client.AddressManager;
-import org.apache.servicecomb.service.center.client.DiscoveryEvents.InstanceChangedEvent;
import org.apache.servicecomb.service.center.client.RegistrationEvents;
import org.apache.servicecomb.service.center.client.RegistrationEvents.HeartBeatEvent;
import org.apache.servicecomb.service.center.client.RegistrationEvents.MicroserviceInstanceRegistrationEvent;
@@ -56,16 +55,13 @@
private CountDownLatch registrationCounter = new CountDownLatch(1);
- private CountDownLatch discoveryCounter = new CountDownLatch(1);
-
- private List<MicroserviceInstance> instances;
-
// auto test only tests 'hasRegistered=false', can run this client many times to test 'hasRegistered=true'
private boolean hasRegistered = true;
@Override
public void testRestTransport() throws Exception {
- AddressManager addressManager = new AddressManager("default", Arrays.asList("http://127.0.0.1:30100"), new EventBus());
+ AddressManager addressManager = new AddressManager("default", Arrays.asList("http://127.0.0.1:30100"),
+ new EventBus());
SSLProperties sslProperties = new SSLProperties();
sslProperties.setEnabled(false);
ServiceCenterClient serviceCenterClient = new ServiceCenterClient(addressManager, sslProperties,
@@ -133,8 +129,9 @@
ServiceCenterDiscovery discovery = new ServiceCenterDiscovery(serviceCenterClient, eventBus);
discovery.updateMyselfServiceId(microservice.getServiceId());
discovery.startDiscovery();
- discovery.registerIfNotPresent(new SubscriptionKey(microservice.getAppId(), microservice.getServiceName()));
- discoveryCounter.await(30000, TimeUnit.MILLISECONDS);
+ SubscriptionKey subscriptionKey = new SubscriptionKey(microservice.getAppId(), microservice.getServiceName());
+ discovery.registerIfNotPresent(subscriptionKey);
+ List<MicroserviceInstance> instances = discovery.getInstanceCache(subscriptionKey);
TestMgr.check(instances != null, true);
TestMgr.check(instances.size(), 1);
discovery.stop();
@@ -163,10 +160,4 @@
events.add(event);
registrationCounter.countDown();
}
-
- @Subscribe
- public void onInstanceChangedEvent(InstanceChangedEvent event) {
- instances = event.getInstances();
- discoveryCounter.countDown();
- }
}