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 2026/09/15 08:51:02 UTC

(dubbo-go) branch develop updated: fix(config-center): emit delete for empty Nacos callbacks (#3725)

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 2e338fa1e fix(config-center): emit delete for empty Nacos callbacks (#3725)
2e338fa1e is described below

commit 2e338fa1e8bdb899501b50d951ca180c2d406b7a
Author: xiaobaicai66695 <57...@qq.com>
AuthorDate: Tue Sep 15 16:50:56 2026 +0800

    fix(config-center): emit delete for empty Nacos callbacks (#3725)
    
    * fix(config-center): emit delete for empty nacos callbacks
---
 config_center/nacos/listener.go      | 13 +++++++++++--
 config_center/nacos/listener_test.go | 15 +++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/config_center/nacos/listener.go b/config_center/nacos/listener.go
index c1b44ff05..d48636720 100644
--- a/config_center/nacos/listener.go
+++ b/config_center/nacos/listener.go
@@ -81,9 +81,18 @@ func (s *keyListenerSet) snapshot() []config_center.ConfigurationListener {
 }
 
 func callback(set *keyListenerSet, _, group, dataId, data string) {
+	eventType := remoting.EventTypeUpdate
+	// Nacos SDK callbacks do not include a change type. In nacos-sdk-go v2.2.5,
+	// a deleted config reaches this callback with empty content. Match the
+	// ZooKeeper cache listener by treating empty content as a deletion. This
+	// intentionally makes deleting a config and updating it to an empty string
+	// equivalent.
+	if data == "" {
+		eventType = remoting.EventTypeDel
+	}
 	for _, l := range set.snapshot() {
-		l.Process(&config_center.ConfigChangeEvent{Key: dataId, Value: data, ConfigType: remoting.EventTypeUpdate})
-		metrics.Publish(metricsConfigCenter.NewIncMetricEvent(dataId, group, remoting.EventTypeUpdate, metricsConfigCenter.Nacos))
+		l.Process(&config_center.ConfigChangeEvent{Key: dataId, Value: data, ConfigType: eventType})
+		metrics.Publish(metricsConfigCenter.NewIncMetricEvent(dataId, group, eventType, metricsConfigCenter.Nacos))
 	}
 }
 
diff --git a/config_center/nacos/listener_test.go b/config_center/nacos/listener_test.go
index 121fe5d32..cbd2f9d19 100644
--- a/config_center/nacos/listener_test.go
+++ b/config_center/nacos/listener_test.go
@@ -49,6 +49,21 @@ func TestCallback(t *testing.T) {
 	}
 }
 
+func TestCallbackDelete(t *testing.T) {
+	l := &recordingListener{}
+	set := newKeyListenerSet("test-group")
+	set.add(l)
+
+	callback(set, "", "g", "data", "")
+
+	if len(l.events) != 1 {
+		t.Fatalf("expected 1 event, got %d", len(l.events))
+	}
+	if l.events[0].Key != "data" || l.events[0].Value != "" || l.events[0].ConfigType != remoting.EventTypeDel {
+		t.Fatalf("unexpected event %+v", l.events[0])
+	}
+}
+
 func TestRemoveListener(t *testing.T) {
 	n := &nacosDynamicConfiguration{}
 	key := "k"