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