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

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


The following commit(s) were added to refs/heads/develop by this push:
     new bd001fe10 fix: replace panic with error handling for cluster extension 
failure (#3021)
bd001fe10 is described below

commit bd001fe10da8df5713cd0a50aaf9279b9a9eef6d
Author: CAICAII <[email protected]>
AuthorDate: Sat Sep 20 17:47:32 2025 +0800

    fix: replace panic with error handling for cluster extension failure (#3021)
    
    * fix: replace panic with error handling for cluster extension failure
    
    * fix: replace all GetCluster panic with error handling
    
    * Change error logging format to use %w for errors
    
    * Update reference_config.go
    
    * Change error logging format to use %w
    
    * fix: improve error formatting in logger statements
---
 config/reference_config.go      | 24 +++++++++++++++++-------
 registry/directory/directory.go | 20 +++++++++++++-------
 registry/protocol/protocol.go   |  9 ++++++++-
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/config/reference_config.go b/config/reference_config.go
index b0e42ea0c..24cc0dd23 100644
--- a/config/reference_config.go
+++ b/config/reference_config.go
@@ -213,7 +213,7 @@ func (rc *ReferenceConfig) Refer(srv any) {
                for _, urlStr := range urlStrings {
                        serviceURL, err := common.NewURL(urlStr)
                        if err != nil {
-                               panic(fmt.Sprintf("url configuration error,  
please check your configuration, user specified URL %v refer error, error 
message is %v ", urlStr, err.Error()))
+                               panic(fmt.Sprintf("url configuration error,  
please check your configuration, user specified URL %v refer error, error 
message is %v ", urlStr, err))
                        }
                        if serviceURL.Protocol == constant.RegistryProtocol { 
// serviceURL in this branch is a registry protocol
                                serviceURL.SubURL = cfgURL
@@ -270,10 +270,15 @@ func (rc *ReferenceConfig) Refer(srv any) {
                        }
                        cluster, err := extension.GetCluster(hitClu)
                        if err != nil {
-                               panic(err)
-                       } else {
-                               rc.invoker = 
cluster.Join(static.NewDirectory(invokers))
+                               logger.Errorf("reference config get cluster %s 
error, error message is %w, will skip this invoker",
+                                       hitClu, err)
+                               return
                        }
+                       if cluster == nil {
+                               logger.Errorf("reference config cluster is nil 
for key %s, will skip this invoker", hitClu)
+                               return
+                       }
+                       rc.invoker = cluster.Join(static.NewDirectory(invokers))
                }
        } else {
                var hitClu string
@@ -289,10 +294,15 @@ func (rc *ReferenceConfig) Refer(srv any) {
                }
                cluster, err := extension.GetCluster(hitClu)
                if err != nil {
-                       panic(err)
-               } else {
-                       rc.invoker = cluster.Join(static.NewDirectory(invokers))
+                       logger.Errorf("reference config get cluster %s error, 
error message is %w, will skip this invoker",
+                               hitClu, err)
+                       return
+               }
+               if cluster == nil {
+                       logger.Errorf("reference config cluster is nil for key 
%s, will skip this invoker", hitClu)
+                       return
                }
+               rc.invoker = cluster.Join(static.NewDirectory(invokers))
        }
 
        // create proxy
diff --git a/registry/directory/directory.go b/registry/directory/directory.go
index 112e67b6f..987e964c9 100644
--- a/registry/directory/directory.go
+++ b/registry/directory/directory.go
@@ -153,8 +153,8 @@ func (dir *RegistryDirectory) Subscribe(url *common.URL) 
error {
                urlToReg := getConsumerUrlToRegistry(url)
                err := dir.registry.Register(urlToReg)
                if err != nil {
-                       logger.Errorf("consumer service %v register registry %v 
error, error message is %s",
-                               url.String(), dir.registry.GetURL().String(), 
err.Error())
+                       logger.Errorf("consumer service %v register registry %v 
error, error message is %v",
+                               url.String(), dir.registry.GetURL().String(), 
err)
                }
 
                close(done)
@@ -367,7 +367,13 @@ func (dir *RegistryDirectory) toGroupInvokers() 
[]protocolbase.Invoker {
                        clusterKey := 
dir.GetURL().SubURL.GetParam(constant.ClusterKey, constant.DefaultCluster)
                        cluster, err := extension.GetCluster(clusterKey)
                        if err != nil {
-                               panic(err)
+                               logger.Errorf("directory get cluster %s error, 
error message is %w, will skip this group",
+                                       clusterKey, err)
+                               continue
+                       }
+                       if cluster == nil {
+                               logger.Errorf("directory cluster is nil for key 
%s, will skip this group", clusterKey)
+                               continue
                        }
                        err = staticDir.BuildRouterChain(invokers, dir.GetURL())
                        if err != nil {
@@ -506,14 +512,14 @@ func (dir *RegistryDirectory) Destroy() {
                if dir.RegisteredUrl != nil {
                        err := dir.registry.UnRegister(dir.RegisteredUrl)
                        if err != nil {
-                               logger.Warnf("Unregister consumer url failed, 
%s", dir.RegisteredUrl.String(), err)
+                               logger.Warnf("Unregister consumer url failed, 
%s, error: %v", dir.RegisteredUrl.String(), err)
                        }
                }
 
                if dir.SubscribedUrl != nil {
                        err := dir.registry.UnSubscribe(dir.SubscribedUrl, dir)
                        if err != nil {
-                               logger.Warnf("Unsubscribe consumer url failed, 
%s", dir.RegisteredUrl.String(), err)
+                               logger.Warnf("Unsubscribe consumer url failed, 
%s, error: %v", dir.RegisteredUrl.String(), err)
                        }
                }
 
@@ -647,8 +653,8 @@ func (dir *ServiceDiscoveryRegistryDirectory) Subscribe(url 
*common.URL) error {
        urlToReg := getConsumerUrlToRegistry(url)
        err := dir.registry.Register(urlToReg)
        if err != nil {
-               logger.Errorf("consumer service %v register registry %v error, 
error message is %s",
-                       url.String(), dir.registry.GetURL().String(), 
err.Error())
+               logger.Errorf("consumer service %v register registry %v error, 
error message is %v",
+                       url.String(), dir.registry.GetURL().String(), err)
                return err
        }
        return nil
diff --git a/registry/protocol/protocol.go b/registry/protocol/protocol.go
index 991ac8150..5611b3d8e 100644
--- a/registry/protocol/protocol.go
+++ b/registry/protocol/protocol.go
@@ -170,7 +170,14 @@ func (proto *registryProtocol) Refer(url *common.URL) 
base.Invoker {
        clusterKey := serviceUrl.GetParam(constant.ClusterKey, 
constant.DefaultCluster)
        cluster, err := extension.GetCluster(clusterKey)
        if err != nil {
-               panic(err)
+               logger.Errorf("consumer service %v get cluster %s error, error 
message is %s, will return nil invoker!",
+                       serviceUrl.String(), clusterKey, err.Error())
+               return nil
+       }
+       if cluster == nil {
+               logger.Errorf("consumer service %v cluster is nil for key %s, 
will return nil invoker!",
+                       serviceUrl.String(), clusterKey)
+               return nil
        }
        invoker := cluster.Join(dic)
        return invoker

Reply via email to