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 2020/07/21 05:57:22 UTC

[dubbo] 01/04: metadata report status

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

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

commit 838dfd6eda89e15887244f8ac69ffe6fb6123170
Author: ken.lj <ke...@gmail.com>
AuthorDate: Tue Jul 7 11:43:17 2020 +0800

    metadata report status
---
 .../org/apache/dubbo/metadata/MetadataInfo.java    | 35 ++++++++++++++++------
 .../metadata/store/RemoteMetadataServiceImpl.java  | 16 +++++-----
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
index 932517d..73e736f 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
@@ -30,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.apache.dubbo.common.constants.CommonConstants.DOT_SEPARATOR;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPERATOR;
@@ -43,6 +44,7 @@ public class MetadataInfo implements Serializable {
     private Map<String, ServiceInfo> services;
 
     private transient Map<String, String> extendParams;
+    private transient AtomicBoolean reported = new AtomicBoolean(false);
 
     public MetadataInfo(String app) {
         this(app, null, null);
@@ -60,6 +62,7 @@ public class MetadataInfo implements Serializable {
             return;
         }
         this.services.put(serviceInfo.getMatchKey(), serviceInfo);
+        markChanged();
     }
 
     public void removeService(ServiceInfo serviceInfo) {
@@ -67,6 +70,7 @@ public class MetadataInfo implements Serializable {
             return;
         }
         this.services.remove(serviceInfo.getMatchKey());
+        markChanged();
     }
 
     public void removeService(String key) {
@@ -74,18 +78,11 @@ public class MetadataInfo implements Serializable {
             return;
         }
         this.services.remove(key);
-    }
-
-    public String getApp() {
-        return app;
-    }
-
-    public void setApp(String app) {
-        this.app = app;
+        markChanged();
     }
 
     public String getRevision() {
-        if (revision != null) {
+        if (revision != null && hasReported()) {
             return revision;
         }
         StringBuilder sb = new StringBuilder();
@@ -101,6 +98,26 @@ public class MetadataInfo implements Serializable {
         this.revision = revision;
     }
 
+    public boolean hasReported() {
+        return reported.get();
+    }
+
+    public void markReported() {
+        reported.compareAndSet(false, true);
+    }
+
+    public void markChanged() {
+        reported.compareAndSet(true, false);
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+
     public Map<String, ServiceInfo> getServices() {
         return services;
     }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java
index 85d6855..ee41050 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java
@@ -62,14 +62,16 @@ public class RemoteMetadataServiceImpl {
     public void publishMetadata(ServiceInstance instance) {
         Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();
         metadataInfos.forEach((registryKey, metadataInfo) -> {
-            SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(), metadataInfo.getRevision());
-            metadataInfo.getRevision();
-            metadataInfo.getExtendParams().put(REGISTRY_KEY, registryKey);
-            MetadataReport metadataReport = getMetadataReports().get(registryKey);
-            if (metadataReport == null) {
-                metadataReport = getMetadataReports().entrySet().iterator().next().getValue();
+            if (!metadataInfo.hasReported()) {
+                SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(), metadataInfo.getRevision());
+                metadataInfo.getRevision();
+                metadataInfo.getExtendParams().put(REGISTRY_KEY, registryKey);
+                MetadataReport metadataReport = getMetadataReports().get(registryKey);
+                if (metadataReport == null) {
+                    metadataReport = getMetadataReports().entrySet().iterator().next().getValue();
+                }
+                metadataReport.publishAppMetadata(identifier, metadataInfo);
             }
-            metadataReport.publishAppMetadata(identifier, metadataInfo);
         });
     }