You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by xu...@apache.org on 2026/06/16 04:52:38 UTC

(dubbo-go) branch develop updated: fix(router): avoid script process panic on invalid config (#3417)

This is an automated email from the ASF dual-hosted git repository.

Alanxtl 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 fd4dea4f8 fix(router): avoid script process panic on invalid config (#3417)
fd4dea4f8 is described below

commit fd4dea4f8ccef79a3190ba1d4a60af775d615135
Author: 吴杨帆 <39...@users.noreply.github.com>
AuthorDate: Tue Jun 16 12:52:33 2026 +0800

    fix(router): avoid script process panic on invalid config (#3417)
    
    * fix(router): avoid script process panic on invalid config
    
    * fix(router): handle script delete without config body
    
    * test(router): cover active script delete event
---
 cluster/router/script/router.go      | 24 ++++++++++++++----------
 cluster/router/script/router_test.go | 30 ++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/cluster/router/script/router.go b/cluster/router/script/router.go
index 8823844c4..84073e15f 100644
--- a/cluster/router/script/router.go
+++ b/cluster/router/script/router.go
@@ -70,9 +70,22 @@ func (s *ScriptRouter) Process(event *config_center.ConfigChangeEvent) {
 	s.mu.Lock()
 	defer s.mu.Unlock()
 
+	if event.ConfigType == remoting.EventTypeDel {
+		in, _ := ins.GetInstances(s.scriptType)
+
+		if in != nil && s.enabled {
+			in.Destroy(s.rawScript)
+		}
+		s.enabled = false
+		s.rawScript = ""
+		s.scriptType = ""
+		return
+	}
+
 	rawConf, ok := event.Value.(string)
 	if !ok {
-		panic(ok)
+		logger.Errorf("[Router][Script] route config value must be string, actualType=%T", event.Value)
+		return
 	}
 	cfg, err := parseRoute(rawConf)
 	if err != nil {
@@ -128,15 +141,6 @@ func (s *ScriptRouter) Process(event *config_center.ConfigChangeEvent) {
 			}
 		}
 
-	case remoting.EventTypeDel:
-		in, _ := ins.GetInstances(s.scriptType)
-
-		if in != nil && s.enabled {
-			in.Destroy(s.rawScript)
-		}
-		s.enabled = false
-		s.rawScript = ""
-		s.scriptType = ""
 	}
 }
 
diff --git a/cluster/router/script/router_test.go b/cluster/router/script/router_test.go
index 8d6bf453f..e9b04c13e 100644
--- a/cluster/router/script/router_test.go
+++ b/cluster/router/script/router_test.go
@@ -227,6 +227,36 @@ script: |
 	}
 }
 
+func TestScriptRouterProcessSkipsNonStringConfig(t *testing.T) {
+	s := &ScriptRouter{
+		enabled:    true,
+		scriptType: "javascript",
+		rawScript:  "old script",
+	}
+
+	assert.NotPanics(t, func() {
+		s.Process(&config_center.ConfigChangeEvent{Key: "", Value: 123, ConfigType: remoting.EventTypeUpdate})
+	})
+	assert.True(t, s.enabled)
+	assert.Equal(t, "javascript", s.scriptType)
+	assert.Equal(t, "old script", s.rawScript)
+}
+
+func TestScriptRouterProcessDelSkipsConfigBody(t *testing.T) {
+	s := &ScriptRouter{
+		enabled:    true,
+		scriptType: "javascript",
+		rawScript:  "old script",
+	}
+
+	assert.NotPanics(t, func() {
+		s.Process(&config_center.ConfigChangeEvent{Key: "", Value: nil, ConfigType: remoting.EventTypeDel})
+	})
+	assert.False(t, s.enabled)
+	assert.Empty(t, s.scriptType)
+	assert.Empty(t, s.rawScript)
+}
+
 func checkInvokersSame(invokers []base.Invoker, otherInvokers []base.Invoker) bool {
 	k := map[string]struct{}{}
 	for _, invoker := range otherInvokers {