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 {

Reply via email to