You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/12/27 08:51:40 UTC

[dubbo] branch 3.0-metadata-refactor updated: check empty metdata info num

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 3.0-metadata-refactor
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0-metadata-refactor by this push:
     new 64d935d  check empty metdata info num
64d935d is described below

commit 64d935d064dd0a7a22b1e0cfbdce6e1ad5233d51
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 27 16:50:34 2021 +0800

    check empty metdata info num
---
 .../registry/client/AbstractServiceDiscovery.java   |  2 +-
 .../listener/ServiceInstancesChangedListener.java   | 21 ++++++++++++---------
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
index 517ebaf..2afed98 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
@@ -44,7 +44,7 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU
  * Each service discovery is bond to one application.
  */
 public abstract class AbstractServiceDiscovery implements ServiceDiscovery {
-    private Logger logger = LoggerFactory.getLogger(AbstractServiceDiscovery.class);
+    private final Logger logger = LoggerFactory.getLogger(AbstractServiceDiscovery.class);
     private volatile boolean isDestroy;
 
     protected final String serviceName;
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
index 848ea92..13ecc9b 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
@@ -52,7 +52,6 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;
 import static org.apache.dubbo.common.constants.RegistryConstants.ENABLE_EMPTY_PROTECTION_KEY;
 import static org.apache.dubbo.metadata.RevisionResolver.EMPTY_REVISION;
@@ -138,14 +137,15 @@ public class ServiceInstancesChangedListener {
             parseMetadata(revision, metadata, localServiceToRevisions);
             // update metadata into each instance, in case new instance created.
             for (ServiceInstance tmpInstance : subInstances) {
-                MetadataInfo originMetadata = ((DefaultServiceInstance) tmpInstance).getServiceMetadata();
+                MetadataInfo originMetadata = tmpInstance.getServiceMetadata();
                 if (originMetadata == null || !Objects.equals(originMetadata.getRevision(), metadata.getRevision())) {
-                    ((DefaultServiceInstance) tmpInstance).setServiceMetadata(metadata);
+                    tmpInstance.setServiceMetadata(metadata);
                 }
             }
         }
 
-        if (hasEmptyMetadata(revisionToInstances)) {// retry every 10 seconds
+        int emptyNum = hasEmptyMetadata(revisionToInstances);
+        if (emptyNum != 0) {// retry every 10 seconds
             hasEmptyMetadata = true;
             if (retryPermission.tryAcquire()) {
                 if (retryFuture != null && !retryFuture.isDone()) {
@@ -156,7 +156,9 @@ public class ServiceInstancesChangedListener {
                 logger.warn("Address refresh try task submitted.");
             }
             logger.error("Address refresh failed because of Metadata Server failure, wait for retry or new address refresh event.");
-            return;
+            if (emptyNum == revisionToInstances.size()) {// return if all metadata is empty
+                return;
+            }
         }
         hasEmptyMetadata = false;
 
@@ -283,17 +285,18 @@ public class ServiceInstancesChangedListener {
         lastRefreshTime = System.currentTimeMillis();
     }
 
-    protected boolean hasEmptyMetadata(Map<String, List<ServiceInstance>> revisionToInstances) {
+    protected int hasEmptyMetadata(Map<String, List<ServiceInstance>> revisionToInstances) {
         if (revisionToInstances == null) {
-            return false;
+            return 0;
         }
+        int emptyMetadataNum = 0;
         for (Map.Entry<String, List<ServiceInstance>> entry : revisionToInstances.entrySet()) {
             DefaultServiceInstance serviceInstance = (DefaultServiceInstance) entry.getValue().get(0);
             if (serviceInstance == null || serviceInstance.getServiceMetadata() == MetadataInfo.EMPTY) {
-                return true;
+                emptyMetadataNum++;
             }
         }
-        return false;
+        return emptyMetadataNum;
     }
 
     protected Map<String, Map<String, Set<String>>> parseMetadata(String revision, MetadataInfo metadata, Map<String, Map<String, Set<String>>> localServiceToRevisions) {