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: 吴杨帆 <[email protected]>
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 {

Reply via email to