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 64d946610 fix: correctly distinguish between empty nodes and
non-existent nodes in config center (nacos), and change Zookeeper's empty node
errorf to warnf (#3059)
64d946610 is described below
commit 64d946610a791a8ef1f9711580c69421970719bd
Author: yxrxy <[email protected]>
AuthorDate: Sat Oct 25 00:44:09 2025 +0800
fix: correctly distinguish between empty nodes and non-existent nodes in
config center (nacos), and change Zookeeper's empty node errorf to warnf (#3059)
* fix: correctly distinguish between empty nodes and non-existent nodes in
config center (nacos), and change Zookeeper's empty node errorf to warnf
---
config_center/nacos/impl.go | 26 ++++++++++++++++++++------
config_center/zookeeper/impl.go | 5 +++++
go.mod | 13 +++++++++----
go.sum | 22 ++++++++++++++++++----
registry/nacos/registry_test.go | 12 ++++++++++++
registry/nacos/service_discovery_test.go | 4 ++++
6 files changed, 68 insertions(+), 14 deletions(-)
diff --git a/config_center/nacos/impl.go b/config_center/nacos/impl.go
index 00f3cc1b3..56955d8f7 100644
--- a/config_center/nacos/impl.go
+++ b/config_center/nacos/impl.go
@@ -159,19 +159,33 @@ func (n *nacosDynamicConfiguration)
GetConfigKeysByGroup(group string) (*gxset.H
return result, nil
}
-// GetRule Get router rule
+// GetRule retrieves a router rule from Nacos configuration center.
func (n *nacosDynamicConfiguration) GetRule(key string, opts
...config_center.Option) (string, error) {
tmpOpts := config_center.NewOptions(opts...)
- resolvedGroup := n.resolvedGroup(tmpOpts.Center.Group)
+ group := n.resolvedGroup(tmpOpts.Center.Group)
+
content, err := n.client.Client().GetConfig(vo.ConfigParam{
DataId: key,
- Group: resolvedGroup,
+ Group: group,
})
- if err != nil {
- return "", perrors.WithStack(err)
- } else {
+ if err == nil {
return content, nil
}
+
+ // Handle "config not exist" gracefully (normal during initialization)
+ if isConfigNotExistErr(err) {
+ logger.Warnf("config not found, key=%s, group=%s, err=%v", key,
group, err)
+ return "", nil
+ }
+
+ // Other unexpected errors
+ logger.Errorf("failed to query rule, key=%s, group=%s, err=%+v", key,
group, err)
+ return "", perrors.WithStack(err)
+}
+
+// isConfigNotExistErr is a helper to handle legacy SDKs that return
string-based errors.
+func isConfigNotExistErr(err error) bool {
+ return err != nil && strings.Contains(strings.ToLower(err.Error()),
"config data not exist")
}
// Parser Get Parser
diff --git a/config_center/zookeeper/impl.go b/config_center/zookeeper/impl.go
index 14b529ab6..a0f2efd4a 100644
--- a/config_center/zookeeper/impl.go
+++ b/config_center/zookeeper/impl.go
@@ -19,6 +19,7 @@ package zookeeper
import (
"encoding/base64"
+ "errors"
"strconv"
"strings"
"sync"
@@ -134,6 +135,10 @@ func (c *zookeeperDynamicConfiguration) GetProperties(key
string, opts ...config
key = c.GetURL().GetParam(constant.ConfigNamespaceKey,
config_center.DefaultGroup) + "/" + key
}
content, _, err := c.client.GetContent(c.rootPath + "/" + key)
+ if errors.Is(err, zk.ErrNoNode) {
+ logger.Warnf("query rule fail, key=%s, err=%v", key, err)
+ return "", nil
+ }
if err != nil {
return "", perrors.WithStack(err)
}
diff --git a/go.mod b/go.mod
index 1f3e6628d..724ec6c7a 100644
--- a/go.mod
+++ b/go.mod
@@ -36,7 +36,7 @@ require (
github.com/mattn/go-colorable v0.1.13
github.com/mitchellh/mapstructure v1.5.0
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
- github.com/nacos-group/nacos-sdk-go/v2 v2.2.2
+ github.com/nacos-group/nacos-sdk-go/v2 v2.2.5
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852
github.com/opentracing/opentracing-go v1.2.0
@@ -46,6 +46,7 @@ require (
github.com/prometheus/common v0.48.0
github.com/quic-go/quic-go v0.52.0
github.com/sirupsen/logrus v1.8.1
+ github.com/spf13/viper v1.8.1
github.com/stretchr/testify v1.9.0
github.com/ugorji/go/codec v1.2.6
go.etcd.io/etcd/api/v3 v3.5.7
@@ -71,7 +72,12 @@ require (
)
require (
- github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 // indirect
+ github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 //
indirect
+ github.com/alibabacloud-go/tea v1.1.17 // indirect
+ github.com/alibabacloud-go/tea-utils v1.4.4 // indirect
+ github.com/aliyun/alibaba-cloud-sdk-go v1.61.1800 // indirect
+ github.com/aliyun/alibabacloud-dkms-gcs-go-sdk v0.2.2 // indirect
+ github.com/aliyun/alibabacloud-dkms-transfer-go-sdk v0.1.7 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.2.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
@@ -123,7 +129,6 @@ require (
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
- github.com/spf13/viper v1.8.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.10 // indirect
@@ -140,7 +145,7 @@ require (
golang.org/x/mod v0.18.0 // indirect
golang.org/x/sys v0.23.0 // indirect
golang.org/x/text v0.17.0 // indirect
- golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect
+ golang.org/x/time v0.1.0 // indirect
golang.org/x/tools v0.22.0 // indirect
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d //
indirect
google.golang.org/genproto/googleapis/api
v0.0.0-20230822172742-b8732ec3820d // indirect
diff --git a/go.sum b/go.sum
index 1e3ca1800..d2b8ffc56 100644
--- a/go.sum
+++ b/go.sum
@@ -66,9 +66,21 @@ github.com/alecthomas/units
v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod
h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alibaba/sentinel-golang v1.0.4
h1:i0wtMvNVdy7vM4DdzYrlC4r/Mpk1OKUUBurKKkWhEo8=
github.com/alibaba/sentinel-golang v1.0.4/go.mod
h1:Lag5rIYyJiPOylK8Kku2P+a23gdKMMqzQS7wTnjWEpk=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68
h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod
h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
+github.com/alibabacloud-go/tea v1.1.0/go.mod
h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
+github.com/alibabacloud-go/tea v1.1.17
h1:05R5DnaJXe9sCNIe8KUgWHC/z6w/VZIwczgUwzRnul8=
+github.com/alibabacloud-go/tea v1.1.17/go.mod
h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
+github.com/alibabacloud-go/tea-utils v1.4.4
h1:lxCDvNCdTo9FaXKKq45+4vGETQUKNOW/qKTcX9Sk53o=
+github.com/alibabacloud-go/tea-utils v1.4.4/go.mod
h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod
h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=
-github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704
h1:PpfENOj/vPfhhy9N2OFRjpue0hjM5XqAp2thFmkXXIk=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704/go.mod
h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
+github.com/aliyun/alibaba-cloud-sdk-go v1.61.1800
h1:ie/8RxBOfKZWcrbYSJi2Z8uX8TcOlSMwPlEJh83OeOw=
+github.com/aliyun/alibaba-cloud-sdk-go v1.61.1800/go.mod
h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
+github.com/aliyun/alibabacloud-dkms-gcs-go-sdk v0.2.2
h1:rWkH6D2XlXb/Y+tNAQROxBzp3a0p92ni+pXcaHBe/WI=
+github.com/aliyun/alibabacloud-dkms-gcs-go-sdk v0.2.2/go.mod
h1:GDtq+Kw+v0fO+j5BrrWiUHbBq7L+hfpzpPfXKOZMFE0=
+github.com/aliyun/alibabacloud-dkms-transfer-go-sdk v0.1.7
h1:olLiPI2iM8Hqq6vKnSxpM3awCrm9/BeOgHpzQkOYnI4=
+github.com/aliyun/alibabacloud-dkms-transfer-go-sdk v0.1.7/go.mod
h1:oDg1j4kFxnhgftaiLJABkGeSvuEvSF5Lo6UmRAMruX4=
github.com/antihax/optional v1.0.0/go.mod
h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/dubbo-getty v1.4.10
h1:ZmkpHJa/qgS0evX2tTNqNCz6rClI/9Wwp7ctyMml82w=
github.com/apache/dubbo-getty v1.4.10/go.mod
h1:V64WqLIxksEgNu5aBJBOxNIvpOZyfUJ7J/DXBlKSUoA=
@@ -581,8 +593,8 @@ github.com/mwitkow/go-conntrack
v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod
h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nacos-group/nacos-sdk-go v1.0.8/go.mod
h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA=
github.com/nacos-group/nacos-sdk-go/v2 v2.1.2/go.mod
h1:ys/1adWeKXXzbNWfRNbaFlX/t6HVLWdpsNDvmoWTw0g=
-github.com/nacos-group/nacos-sdk-go/v2 v2.2.2
h1:FI+7vr1fvCA4jbgx36KezmP3zlU/WoP/7wAloaSd1Ew=
-github.com/nacos-group/nacos-sdk-go/v2 v2.2.2/go.mod
h1:ys/1adWeKXXzbNWfRNbaFlX/t6HVLWdpsNDvmoWTw0g=
+github.com/nacos-group/nacos-sdk-go/v2 v2.2.5
h1:r0wwT7PayEjvEHzWXwr1ROi/JSqzujM4w+1L5ikThzQ=
+github.com/nacos-group/nacos-sdk-go/v2 v2.2.5/go.mod
h1:OObBon0prVJVPoIbSZxpEkFiBfL0d1LcBtuAMiNn+8c=
github.com/natefinch/lumberjack v2.0.0+incompatible
h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod
h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/nats-io/jwt v0.3.0/go.mod
h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
@@ -909,6 +921,7 @@ golang.org/x/crypto
v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod
h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@@ -1149,8 +1162,9 @@ golang.org/x/time
v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9
h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ=
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
+golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/registry/nacos/registry_test.go b/registry/nacos/registry_test.go
index 928d46501..9c00c6232 100644
--- a/registry/nacos/registry_test.go
+++ b/registry/nacos/registry_test.go
@@ -204,6 +204,18 @@ func (mr *MockINamingClientMockRecorder)
GetAllServicesInfo(param any) *gomock.C
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock,
"GetAllServicesInfo",
reflect.TypeOf((*MockINamingClient)(nil).GetAllServicesInfo), param)
}
+// ServerHealthy mocks base method
+func (m *MockINamingClient) ServerHealthy() bool {
+ ret := m.ctrl.Call(m, "ServerHealthy")
+ ret0, _ := ret[0].(bool)
+ return ret0
+}
+
+// ServerHealthy indicates an expected call of ServerHealthy
+func (mr *MockINamingClientMockRecorder) ServerHealthy() *gomock.Call {
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerHealthy",
reflect.TypeOf((*MockINamingClient)(nil).ServerHealthy))
+}
+
type fields struct {
URL *common.URL
namingClient *nacosClient.NacosNamingClient
diff --git a/registry/nacos/service_discovery_test.go
b/registry/nacos/service_discovery_test.go
index 20a58636b..1f02b1e29 100644
--- a/registry/nacos/service_discovery_test.go
+++ b/registry/nacos/service_discovery_test.go
@@ -334,6 +334,10 @@ func (c mockClient) GetAllServicesInfo(param
vo.GetAllServiceInfoParam) (model.S
func (c mockClient) CloseClient() {
}
+func (c mockClient) ServerHealthy() bool {
+ return true
+}
+
type mockProtocol struct{}
func (m mockProtocol) Export(base.Invoker) base.Exporter {