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();
-  }
 }

Reply via email to