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

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


The following commit(s) were added to refs/heads/main by this push:
     new f04c8d087 fix Panic caused by failure to connect to the peer when 
obtaining remote metadata (#2651)
f04c8d087 is described below

commit f04c8d08753765f6028d2a84b01aa00e42175a04
Author: foghost <[email protected]>
AuthorDate: Mon Apr 29 11:39:17 2024 +0800

    fix Panic caused by failure to connect to the peer when obtaining remote 
metadata (#2651)
---
 common/metadata_info.go                            | 32 ++++++++------
 .../local/metadata_service_proxy_factory.go        |  3 ++
 .../servicediscovery/service_discovery_registry.go |  7 ++-
 .../service_instances_changed_listener_impl.go     | 51 ++++++++++------------
 4 files changed, 50 insertions(+), 43 deletions(-)

diff --git a/common/metadata_info.go b/common/metadata_info.go
index aad5926b7..c9d83103e 100644
--- a/common/metadata_info.go
+++ b/common/metadata_info.go
@@ -33,20 +33,24 @@ import (
        "dubbo.apache.org/dubbo-go/v3/common/constant"
 )
 
-var IncludeKeys = gxset.NewSet(
-       constant.ApplicationKey,
-       constant.GroupKey,
-       constant.TimestampKey,
-       constant.SerializationKey,
-       constant.ClusterKey,
-       constant.LoadbalanceKey,
-       constant.PathKey,
-       constant.TimeoutKey,
-       constant.TokenKey,
-       constant.VersionKey,
-       constant.WarmupKey,
-       constant.WeightKey,
-       constant.ReleaseKey)
+var (
+       IncludeKeys = gxset.NewSet(
+               constant.ApplicationKey,
+               constant.GroupKey,
+               constant.TimestampKey,
+               constant.SerializationKey,
+               constant.ClusterKey,
+               constant.LoadbalanceKey,
+               constant.PathKey,
+               constant.TimeoutKey,
+               constant.TokenKey,
+               constant.VersionKey,
+               constant.WarmupKey,
+               constant.WeightKey,
+               constant.ReleaseKey)
+
+       EmptyMetadataInfo = &MetadataInfo{}
+)
 
 // MetadataInfo the metadata information of instance
 type MetadataInfo struct {
diff --git a/metadata/service/local/metadata_service_proxy_factory.go 
b/metadata/service/local/metadata_service_proxy_factory.go
index b91477805..9645374b3 100644
--- a/metadata/service/local/metadata_service_proxy_factory.go
+++ b/metadata/service/local/metadata_service_proxy_factory.go
@@ -67,6 +67,9 @@ func createProxy(ins registry.ServiceInstance) 
service.MetadataService {
        u := urls[0]
        p := extension.GetProtocol(u.Protocol)
        invoker := p.Refer(u)
+       if invoker == nil { // can't connect instance
+               return nil
+       }
        return &MetadataServiceProxy{
                Invoker: invoker,
        }
diff --git a/registry/servicediscovery/service_discovery_registry.go 
b/registry/servicediscovery/service_discovery_registry.go
index 6618544cd..70075db91 100644
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@ -221,7 +221,10 @@ func (s *ServiceDiscoveryRegistry) Subscribe(url 
*common.URL, notify registry.No
        }
        logger.Infof("Find initial mapping applications %q for service %s.", 
services, url.ServiceKey())
        // first notify
-       
mappingListener.OnEvent(registry.NewServiceMappingChangedEvent(url.ServiceKey(),
 services))
+       err = 
mappingListener.OnEvent(registry.NewServiceMappingChangedEvent(url.ServiceKey(),
 services))
+       if err != nil {
+               logger.Errorf("[ServiceDiscoveryRegistry] 
ServiceInstancesChangedListenerImpl handle error:%v", err)
+       }
        return nil
 }
 
@@ -246,7 +249,7 @@ func (s *ServiceDiscoveryRegistry) SubscribeURL(url 
*common.URL, notify registry
                                Instances:   instances,
                        })
                        if err != nil {
-                               logger.Warnf("[ServiceDiscoveryRegistry] 
ServiceInstancesChangedListenerImpl handle error:%v", err)
+                               logger.Errorf("[ServiceDiscoveryRegistry] 
ServiceInstancesChangedListenerImpl handle error:%v", err)
                        }
                }
        }
diff --git 
a/registry/servicediscovery/service_instances_changed_listener_impl.go 
b/registry/servicediscovery/service_instances_changed_listener_impl.go
index 5b5433049..ea21510b2 100644
--- a/registry/servicediscovery/service_instances_changed_listener_impl.go
+++ b/registry/servicediscovery/service_instances_changed_listener_impl.go
@@ -19,6 +19,7 @@ package servicediscovery
 
 import (
        "encoding/gob"
+       "errors"
        "reflect"
        "sync"
        "time"
@@ -87,7 +88,6 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e 
observer.Event) error
        if !ok {
                return nil
        }
-       var err error
 
        lstn.mutex.Lock()
        defer lstn.mutex.Unlock()
@@ -119,15 +119,7 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e 
observer.Event) error
                        revisionToInstances[revision] = append(subInstances, 
instance)
                        metadataInfo := lstn.revisionToMetadata[revision]
                        if metadataInfo == nil {
-                               if val, ok := metaCache.Get(revision); ok {
-                                       metadataInfo = 
val.(*common.MetadataInfo)
-                               } else {
-                                       metadataInfo, err = 
GetMetadataInfo(lstn.app, instance, revision)
-                                       if err != nil {
-                                               return err
-                                       }
-                                       metaCache.Set(revision, metadataInfo)
-                               }
+                               metadataInfo = GetMetadataInfo(lstn.app, 
instance, revision)
                        }
                        instance.SetServiceMetadata(metadataInfo)
                        for _, service := range metadataInfo.Services {
@@ -225,44 +217,49 @@ func (lstn *ServiceInstancesChangedListenerImpl) 
GetEventType() reflect.Type {
 }
 
 // GetMetadataInfo get metadata info when MetadataStorageTypePropertyName is 
null
-func GetMetadataInfo(app string, instance registry.ServiceInstance, revision 
string) (*common.MetadataInfo, error) {
+func GetMetadataInfo(app string, instance registry.ServiceInstance, revision 
string) *common.MetadataInfo {
        cacheOnce.Do(func() {
                initCache(app)
        })
        if metadataInfo, ok := metaCache.Get(revision); ok {
-               return metadataInfo.(*common.MetadataInfo), nil
+               return metadataInfo.(*common.MetadataInfo)
        }
 
        var metadataStorageType string
-       var metadataInfo *common.MetadataInfo
+       metadataInfo := common.EmptyMetadataInfo
+       var err error
        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
+               remoteMetadataServiceImpl, remoteMetadataErr := 
extension.GetRemoteMetadataService()
+               if remoteMetadataErr == nil {
+                       metadataInfo, err = 
remoteMetadataServiceImpl.GetMetadata(instance)
+               } else {
+                       err = remoteMetadataErr
                }
        } else {
-               var err error
                proxyFactory := 
extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
                metadataService := proxyFactory.GetProxy(instance)
-               defer destroyInvoker(metadataService)
-               metadataInfo, err = metadataService.GetMetadataInfo(revision)
-               if err != nil {
-                       return nil, err
+               if metadataService != nil {
+                       defer destroyInvoker(metadataService)
+                       metadataInfo, err = 
metadataService.GetMetadataInfo(revision)
+               } else {
+                       err = errors.New("get remote metadata error please 
check instance " + instance.GetHost() + " is alive")
                }
        }
 
-       metaCache.Set(revision, metadataInfo)
+       if err != nil {
+               logger.Errorf("get metadata of %s failed, %v", 
instance.GetHost(), err)
+       }
+
+       if metadataInfo != common.EmptyMetadataInfo {
+               metaCache.Set(revision, metadataInfo)
+       }
 
-       return metadataInfo, nil
+       return metadataInfo
 }
 
 func destroyInvoker(metadataService service.MetadataService) {

Reply via email to