[SCB-2327]discovery first pull not properly synchronized and may result in empty instance (#2536)
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 625db29..43a9f9a 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
@@ -98,6 +98,8 @@
private boolean started = false;
+ private final Object lock = new Object();
+
public ServiceCenterDiscovery(ServiceCenterClient serviceCenterClient, EventBus eventBus) {
super("service-center-discovery-task");
this.serviceCenterClient = serviceCenterClient;
@@ -124,19 +126,22 @@
}
}
- public void register(SubscriptionKey subscriptionKey) {
- this.instancesCache.computeIfAbsent(subscriptionKey, (key) -> new SubscriptionValue());
- pullInstance(subscriptionKey, this.instancesCache.get(subscriptionKey));
+ public void registerIfNotPresent(SubscriptionKey subscriptionKey) {
+ if (this.instancesCache.get(subscriptionKey) == null) {
+ synchronized (lock) {
+ if (this.instancesCache.get(subscriptionKey) == null) {
+ SubscriptionValue value = new SubscriptionValue();
+ pullInstance(subscriptionKey, value);
+ this.instancesCache.put(subscriptionKey, value);
+ }
+ }
+ }
}
public List<MicroserviceInstance> getInstanceCache(SubscriptionKey key) {
return this.instancesCache.get(key).instancesCache;
}
- public boolean isRegistered(SubscriptionKey key) {
- return this.instancesCache.get(key) != null;
- }
-
@Subscribe
public void onPullInstanceEvent(PullInstanceEvent event) {
pullAllInstance();
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 d64dc24..ef523b2 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
@@ -133,7 +133,7 @@
ServiceCenterDiscovery discovery = new ServiceCenterDiscovery(serviceCenterClient, eventBus);
discovery.updateMyselfServiceId(microservice.getServiceId());
discovery.startDiscovery();
- discovery.register(new SubscriptionKey(microservice.getAppId(), microservice.getServiceName()));
+ discovery.registerIfNotPresent(new SubscriptionKey(microservice.getAppId(), microservice.getServiceName()));
discoveryCounter.await(30000, TimeUnit.MILLISECONDS);
TestMgr.check(instances != null, true);
TestMgr.check(instances.size(), 1);