You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2025/09/20 09:47:38 UTC

(dubbo-go) branch develop updated: fix: replace panic with error handling for cluster extension failure (#3021)

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 <39...@users.noreply.github.com>
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