This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 8aa12d305 [SCB-2621]fix problem of discovery will stop due to list
concurrent m… (#3154)
8aa12d305 is described below
commit 8aa12d3059de4fc3b6347d85d631db2e29ecf9dd
Author: liubao68 <[email protected]>
AuthorDate: Wed Jun 29 19:08:20 2022 +0800
[SCB-2621]fix problem of discovery will stop due to list concurrent m…
(#3154)
---
.../servicecomb/config/kie/client/KieClient.java | 4 ++--
.../center/client/ServiceCenterDiscovery.java | 24 +++++++++++++---------
.../RegistryClientTest.java | 19 +++++------------
3 files changed, 21 insertions(+), 26 deletions(-)
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 75e8afc23..1e099e030 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 @@ public class KieClient implements KieConfigOperation {
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 @@ public class KieClient implements KieConfigOperation {
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 c28af01f9..6406325a0 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 @@ public class ServiceCenterDiscovery extends AbstractTask {
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 @@ public class ServiceCenterDiscovery extends AbstractTask {
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 @@ public class ServiceCenterDiscovery extends AbstractTask {
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 @@ public class ServiceCenterDiscovery extends AbstractTask {
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 @@ public class ServiceCenterDiscovery extends AbstractTask {
);
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 @@ public class ServiceCenterDiscovery extends AbstractTask {
}
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 3f54cfeb2..9fff0cf87 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.foundation.common.event.SimpleEventBus;
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 @@ public class RegistryClientTest implements
CategorizedTestCase {
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 @@ public class RegistryClientTest implements
CategorizedTestCase {
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 @@ public class RegistryClientTest implements
CategorizedTestCase {
events.add(event);
registrationCounter.countDown();
}
-
- @Subscribe
- public void onInstanceChangedEvent(InstanceChangedEvent event) {
- instances = event.getInstances();
- discoveryCounter.countDown();
- }
}