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