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

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


The following commit(s) were added to refs/heads/3.0 by this push:
     new c2bb0b3a5 Fix: service discovery registry notify before return (#2168)
c2bb0b3a5 is described below

commit c2bb0b3a51d5c74d3c46eb130913422b1a746884
Author: Leo Shen <[email protected]>
AuthorDate: Fri Jan 6 23:00:53 2023 +0800

    Fix: service discovery registry notify before return (#2168)
    
    * Fix: service discovery registry notify before return
    
    * format import
    
    * modify notify url
    
    * add judge about the existence of instance's metadata revision
---
 .../service_instances_changed_listener_impl.go     | 62 +++++++++++-----------
 .../servicediscovery/service_discovery_registry.go | 28 +++++++++-
 2 files changed, 58 insertions(+), 32 deletions(-)

diff --git a/registry/event/service_instances_changed_listener_impl.go 
b/registry/event/service_instances_changed_listener_impl.go
index a65913aac..b8de36e77 100644
--- a/registry/event/service_instances_changed_listener_impl.go
+++ b/registry/event/service_instances_changed_listener_impl.go
@@ -86,7 +86,7 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e 
observer.Event) error
                        revisionToInstances[revision] = append(subInstances, 
instance)
                        metadataInfo := lstn.revisionToMetadata[revision]
                        if metadataInfo == nil {
-                               metadataInfo, err = 
lstn.getMetadataInfo(instance, revision)
+                               metadataInfo, err = GetMetadataInfo(instance, 
revision)
                                if err != nil {
                                        return err
                                }
@@ -143,36 +143,6 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e 
observer.Event) error
        return nil
 }
 
-// getMetadataInfo get metadata info when MetadataStorageTypePropertyName is 
null
-func (lstn *ServiceInstancesChangedListenerImpl) getMetadataInfo(instance 
registry.ServiceInstance, revision string) (*common.MetadataInfo, error) {
-       var metadataStorageType string
-       var metadataInfo *common.MetadataInfo
-       if instance.GetMetadata() == nil {
-               metadataStorageType = constant.DefaultMetadataStorageType
-       } else {
-               metadataStorageType = 
instance.GetMetadata()[constant.MetadataStorageTypePropertyName]
-       }
-       if metadataStorageType == constant.RemoteMetadataStorageType {
-               remoteMetadataServiceImpl, err := 
extension.GetRemoteMetadataService()
-               if err != nil {
-                       return nil, err
-               }
-               metadataInfo, err = 
remoteMetadataServiceImpl.GetMetadata(instance)
-               if err != nil {
-                       return nil, err
-               }
-       } else {
-               var err error
-               proxyFactory := 
extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
-               metadataService := proxyFactory.GetProxy(instance)
-               metadataInfo, err = metadataService.GetMetadataInfo(revision)
-               if err != nil {
-                       return nil, err
-               }
-       }
-       return metadataInfo, nil
-}
-
 // AddListenerAndNotify add notify listener and notify to listen service event
 func (lstn *ServiceInstancesChangedListenerImpl) 
AddListenerAndNotify(serviceKey string, notify registry.NotifyListener) {
        lstn.listeners[serviceKey] = notify
@@ -212,3 +182,33 @@ func (lstn *ServiceInstancesChangedListenerImpl) 
GetPriority() int {
 func (lstn *ServiceInstancesChangedListenerImpl) GetEventType() reflect.Type {
        return reflect.TypeOf(&registry.ServiceInstancesChangedEvent{})
 }
+
+// GetMetadataInfo get metadata info when MetadataStorageTypePropertyName is 
null
+func GetMetadataInfo(instance registry.ServiceInstance, revision string) 
(*common.MetadataInfo, error) {
+       var metadataStorageType string
+       var metadataInfo *common.MetadataInfo
+       if instance.GetMetadata() == nil {
+               metadataStorageType = constant.DefaultMetadataStorageType
+       } else {
+               metadataStorageType = 
instance.GetMetadata()[constant.MetadataStorageTypePropertyName]
+       }
+       if metadataStorageType == constant.RemoteMetadataStorageType {
+               remoteMetadataServiceImpl, err := 
extension.GetRemoteMetadataService()
+               if err != nil {
+                       return nil, err
+               }
+               metadataInfo, err = 
remoteMetadataServiceImpl.GetMetadata(instance)
+               if err != nil {
+                       return nil, err
+               }
+       } else {
+               var err error
+               proxyFactory := 
extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
+               metadataService := proxyFactory.GetProxy(instance)
+               metadataInfo, err = metadataService.GetMetadataInfo(revision)
+               if err != nil {
+                       return nil, err
+               }
+       }
+       return metadataInfo, nil
+}
diff --git a/registry/servicediscovery/service_discovery_registry.go 
b/registry/servicediscovery/service_discovery_registry.go
index a967118bb..4bb4cf84b 100644
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@ -42,6 +42,7 @@ import (
        "dubbo.apache.org/dubbo-go/v3/registry"
        "dubbo.apache.org/dubbo-go/v3/registry/event"
        "dubbo.apache.org/dubbo-go/v3/registry/servicediscovery/synthesizer"
+       "dubbo.apache.org/dubbo-go/v3/remoting"
 )
 
 func init() {
@@ -230,7 +231,32 @@ func (s *serviceDiscoveryRegistry) Subscribe(url 
*common.URL, notify registry.No
 }
 
 // LoadSubscribeInstances load subscribe instance
-func (s *serviceDiscoveryRegistry) LoadSubscribeInstances(_ *common.URL, _ 
registry.NotifyListener) error {
+func (s *serviceDiscoveryRegistry) LoadSubscribeInstances(url *common.URL, 
notify registry.NotifyListener) error {
+       appName := url.GetParam(constant.ApplicationKey, url.Username)
+       instances := s.serviceDiscovery.GetInstances(appName)
+       for _, instance := range instances {
+               if instance.GetMetadata() == nil {
+                       logger.Warnf("Instance metadata is nil: %s", 
instance.GetHost())
+                       continue
+               }
+               revision, ok := 
instance.GetMetadata()[constant.ExportedServicesRevisionPropertyName]
+               if !ok {
+                       logger.Warnf("Instance metadata revision is nil: %s", 
instance.GetHost())
+                       continue
+               }
+               if "0" == revision {
+                       logger.Infof("Find instance without valid service 
metadata: %s", instance.GetHost())
+                       continue
+               }
+               metadataInfo, err := event.GetMetadataInfo(instance, revision)
+               if err != nil {
+                       return err
+               }
+               instance.SetServiceMetadata(metadataInfo)
+               for _, url := range instance.ToURLs() {
+                       notify.Notify(&registry.ServiceEvent{Action: 
remoting.EventTypeAdd, Service: url})
+               }
+       }
        return nil
 }
 

Reply via email to