Skip to content

Commit 3b4437e

Browse files
committed
fix: preserve v3 protocol message size compatibility
Keep deprecated ProtocolConfig message size fields available through v3, migrate their values into TripleConfig when nested values are empty, and preserve nested precedence during export. Add YAML, URL propagation, external compilation, and real Triple request-size regression coverage. Signed-off-by: EmptyCity-111 <3047874865@qq.com>
1 parent b7c68e9 commit 3b4437e

7 files changed

Lines changed: 293 additions & 23 deletions

File tree

dubbo_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
import (
2626
"github.com/stretchr/testify/assert"
2727
"github.com/stretchr/testify/require"
28+
29+
"gopkg.in/yaml.v3"
2830
)
2931

3032
import (
@@ -334,6 +336,95 @@ func TestInstanceInitDefaultsExplicitTripleConfig(t *testing.T) {
334336
assert.Equal(t, "4mib", tri.TripleConfig.MaxServerRecvMsgSize)
335337
}
336338

339+
func TestInstanceInitMigratesDeprecatedProtocolMessageSizes(t *testing.T) {
340+
tests := []struct {
341+
name string
342+
protocol *global.ProtocolConfig
343+
wantLegacySend string
344+
wantLegacyRecv string
345+
wantNestedSend string
346+
wantNestedRecv string
347+
}{
348+
{
349+
name: "deprecated values populate empty nested values",
350+
protocol: &global.ProtocolConfig{
351+
MaxServerSendMsgSize: "2mib",
352+
MaxServerRecvMsgSize: "3mib",
353+
TripleConfig: &global.TripleConfig{},
354+
},
355+
wantLegacySend: "2mib",
356+
wantLegacyRecv: "3mib",
357+
wantNestedSend: "2mib",
358+
wantNestedRecv: "3mib",
359+
},
360+
{
361+
name: "nested values take precedence",
362+
protocol: &global.ProtocolConfig{
363+
MaxServerSendMsgSize: "2mib",
364+
MaxServerRecvMsgSize: "3mib",
365+
TripleConfig: &global.TripleConfig{
366+
MaxServerSendMsgSize: "5mib",
367+
MaxServerRecvMsgSize: "6mib",
368+
},
369+
},
370+
wantLegacySend: "2mib",
371+
wantLegacyRecv: "3mib",
372+
wantNestedSend: "5mib",
373+
wantNestedRecv: "6mib",
374+
},
375+
{
376+
name: "empty values use defaults",
377+
protocol: &global.ProtocolConfig{},
378+
wantLegacyRecv: "4mib",
379+
wantNestedRecv: "4mib",
380+
},
381+
}
382+
383+
for _, tt := range tests {
384+
t.Run(tt.name, func(t *testing.T) {
385+
ins, err := NewInstance(func(opts *InstanceOptions) {
386+
opts.Protocols = map[string]*global.ProtocolConfig{
387+
constant.TriProtocol: tt.protocol,
388+
}
389+
})
390+
require.NoError(t, err)
391+
392+
tri := ins.insOpts.Protocols[constant.TriProtocol]
393+
require.NotNil(t, tri)
394+
require.NotNil(t, tri.TripleConfig)
395+
assert.Equal(t, tt.wantLegacySend, tri.MaxServerSendMsgSize)
396+
assert.Equal(t, tt.wantLegacyRecv, tri.MaxServerRecvMsgSize)
397+
assert.Equal(t, tt.wantNestedSend, tri.TripleConfig.MaxServerSendMsgSize)
398+
assert.Equal(t, tt.wantNestedRecv, tri.TripleConfig.MaxServerRecvMsgSize)
399+
})
400+
}
401+
}
402+
403+
func TestInstanceInitMigratesDeprecatedProtocolMessageSizesFromYAML(t *testing.T) {
404+
var protocols map[string]*global.ProtocolConfig
405+
err := yaml.Unmarshal([]byte(`
406+
tri:
407+
name: tri
408+
max-server-send-msg-size: 2mib
409+
max-server-recv-msg-size: 3mib
410+
triple: {}
411+
`), &protocols)
412+
require.NoError(t, err)
413+
414+
ins, err := NewInstance(func(opts *InstanceOptions) {
415+
opts.Protocols = protocols
416+
})
417+
require.NoError(t, err)
418+
419+
tri := ins.insOpts.Protocols[constant.TriProtocol]
420+
require.NotNil(t, tri)
421+
require.NotNil(t, tri.TripleConfig)
422+
assert.Equal(t, "2mib", tri.MaxServerSendMsgSize)
423+
assert.Equal(t, "3mib", tri.MaxServerRecvMsgSize)
424+
assert.Equal(t, "2mib", tri.TripleConfig.MaxServerSendMsgSize)
425+
assert.Equal(t, "3mib", tri.TripleConfig.MaxServerRecvMsgSize)
426+
}
427+
337428
func TestInstanceInitTranslatesGlobalRegistryAddress(t *testing.T) {
338429
ins, err := NewInstance(func(opts *InstanceOptions) {
339430
opts.Registries = map[string]*global.RegistryConfig{

global/config_test.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -997,9 +997,11 @@ func TestRouterConfigFields(t *testing.T) {
997997
func TestProtocolConfigClone(t *testing.T) {
998998
t.Run("clone_full_protocol_config", func(t *testing.T) {
999999
proto := &ProtocolConfig{
1000-
Name: "tri",
1001-
Ip: "localhost",
1002-
Port: "20880",
1000+
Name: "tri",
1001+
Ip: "localhost",
1002+
Port: "20880",
1003+
MaxServerSendMsgSize: "1mb",
1004+
MaxServerRecvMsgSize: "3mb",
10031005
TripleConfig: &TripleConfig{
10041006
MaxServerSendMsgSize: "2mb",
10051007
MaxServerRecvMsgSize: "4mb",
@@ -1018,6 +1020,8 @@ func TestProtocolConfigClone(t *testing.T) {
10181020
assert.Equal(t, proto.Name, cloned.Name)
10191021
assert.Equal(t, proto.Ip, cloned.Ip)
10201022
assert.Equal(t, proto.Port, cloned.Port)
1023+
assert.Equal(t, proto.MaxServerSendMsgSize, cloned.MaxServerSendMsgSize)
1024+
assert.Equal(t, proto.MaxServerRecvMsgSize, cloned.MaxServerRecvMsgSize)
10211025
assert.NotSame(t, proto, cloned)
10221026
assert.NotSame(t, proto.TripleConfig, cloned.TripleConfig)
10231027
assert.NotNil(t, cloned.TripleConfig)
@@ -1043,16 +1047,20 @@ func TestProtocolConfigClone(t *testing.T) {
10431047

10441048
t.Run("clone_protocol_config_preserves_protocol_fields", func(t *testing.T) {
10451049
proto := &ProtocolConfig{
1046-
Name: "http",
1047-
Ip: "localhost",
1048-
Port: "8080",
1049-
Params: map[string]string{"key": "value"},
1050+
Name: "http",
1051+
Ip: "localhost",
1052+
Port: "8080",
1053+
Params: map[string]string{"key": "value"},
1054+
MaxServerSendMsgSize: "10mb",
1055+
MaxServerRecvMsgSize: "10mb",
10501056
}
10511057
cloned := proto.Clone()
10521058
assert.Equal(t, "http", cloned.Name)
10531059
assert.Equal(t, "localhost", cloned.Ip)
10541060
assert.Equal(t, "8080", cloned.Port)
10551061
assert.Equal(t, proto.Params, cloned.Params)
1062+
assert.Equal(t, "10mb", cloned.MaxServerSendMsgSize)
1063+
assert.Equal(t, "10mb", cloned.MaxServerRecvMsgSize)
10561064
})
10571065
}
10581066

@@ -1070,12 +1078,19 @@ func TestDefaultProtocolConfig(t *testing.T) {
10701078

10711079
// TestProtocolConfigFields tests individual fields of ProtocolConfig
10721080
func TestProtocolConfigFields(t *testing.T) {
1073-
t.Run("triple_fields_are_nested", func(t *testing.T) {
1081+
t.Run("deprecated_triple_fields_remain_available_in_v3", func(t *testing.T) {
10741082
protocolType := reflect.TypeFor[ProtocolConfig]()
10751083
_, hasSendSize := protocolType.FieldByName("MaxServerSendMsgSize")
10761084
_, hasRecvSize := protocolType.FieldByName("MaxServerRecvMsgSize")
1077-
assert.False(t, hasSendSize)
1078-
assert.False(t, hasRecvSize)
1085+
assert.True(t, hasSendSize)
1086+
assert.True(t, hasRecvSize)
1087+
1088+
proto := ProtocolConfig{
1089+
MaxServerSendMsgSize: "1mib",
1090+
MaxServerRecvMsgSize: "2mib",
1091+
}
1092+
assert.Equal(t, "1mib", proto.MaxServerSendMsgSize)
1093+
assert.Equal(t, "2mib", proto.MaxServerRecvMsgSize)
10791094
})
10801095

10811096
t.Run("protocol_config_name", func(t *testing.T) {

global/protocol_config.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@ type ProtocolConfig struct {
3131
Params any `yaml:"params" json:"params,omitempty" property:"params"`
3232

3333
TripleConfig *TripleConfig `yaml:"triple" json:"triple,omitempty" property:"triple"`
34+
35+
// TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when version 4.0.0
36+
//
37+
// MaxServerSendMsgSize max size of server send message, 1mb=1000kb=1000000b 1mib=1024kb=1048576b.
38+
// more detail to see https://pkg.go.dev/github.com/dustin/go-humanize#pkg-constants
39+
//
40+
// Deprecated: use TripleConfig.MaxServerSendMsgSize or the "triple/max-server-send-msg-size" config key instead.
41+
MaxServerSendMsgSize string `yaml:"max-server-send-msg-size" json:"max-server-send-msg-size,omitempty"`
42+
// TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when version 4.0.0
43+
//
44+
// MaxServerRecvMsgSize max size of server receive message.
45+
//
46+
// Deprecated: use TripleConfig.MaxServerRecvMsgSize or the "triple/max-server-recv-msg-size" config key instead.
47+
MaxServerRecvMsgSize string `default:"4mib" yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
3448
}
3549

3650
// DefaultProtocolConfig returns a default ProtocolConfig instance.
@@ -49,10 +63,12 @@ func (c *ProtocolConfig) Clone() *ProtocolConfig {
4963
}
5064

5165
return &ProtocolConfig{
52-
Name: c.Name,
53-
Ip: c.Ip,
54-
Port: c.Port,
55-
Params: c.Params,
56-
TripleConfig: c.TripleConfig.Clone(),
66+
Name: c.Name,
67+
Ip: c.Ip,
68+
Port: c.Port,
69+
Params: c.Params,
70+
TripleConfig: c.TripleConfig.Clone(),
71+
MaxServerSendMsgSize: c.MaxServerSendMsgSize,
72+
MaxServerRecvMsgSize: c.MaxServerRecvMsgSize,
5773
}
5874
}

instance_options_init.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ func (rc *InstanceOptions) initGlobalProtocols() error {
140140
}
141141

142142
func initGlobalProtocol(protocolConfig *global.ProtocolConfig) error {
143+
legacySendMsgSize := protocolConfig.MaxServerSendMsgSize
144+
legacyRecvMsgSize := protocolConfig.MaxServerRecvMsgSize
145+
nestedSendMsgSizeSet := protocolConfig.TripleConfig != nil && protocolConfig.TripleConfig.MaxServerSendMsgSize != ""
146+
nestedRecvMsgSizeSet := protocolConfig.TripleConfig != nil && protocolConfig.TripleConfig.MaxServerRecvMsgSize != ""
147+
143148
if err := defaults.Set(protocolConfig); err != nil {
144149
return err
145150
}
@@ -163,6 +168,15 @@ func initGlobalProtocol(protocolConfig *global.ProtocolConfig) error {
163168
}
164169
protocolConfig.TripleConfig.OpenAPI.Init()
165170
}
171+
172+
// Keep v3 configurations source-compatible while converging on TripleConfig.
173+
// A non-empty nested value wins; otherwise migrate the deprecated value.
174+
if !nestedSendMsgSizeSet && legacySendMsgSize != "" {
175+
protocolConfig.TripleConfig.MaxServerSendMsgSize = legacySendMsgSize
176+
}
177+
if !nestedRecvMsgSizeSet && legacyRecvMsgSize != "" {
178+
protocolConfig.TripleConfig.MaxServerRecvMsgSize = legacyRecvMsgSize
179+
}
166180
return commonCfg.Verify(protocolConfig)
167181
}
168182

server/action.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,17 @@ func (svcOpts *ServiceOptions) Export() error {
184184
isIDL = svcOpts.IDLMode
185185
}
186186

187-
var maxServerSendMsgSize, maxServerRecvMsgSize string
187+
// Keep accepting the deprecated protocol-level fields through v3. Nested
188+
// Triple values take precedence when both forms are configured.
189+
maxServerSendMsgSize := protocolConf.MaxServerSendMsgSize
190+
maxServerRecvMsgSize := protocolConf.MaxServerRecvMsgSize
188191
if protocolConf.TripleConfig != nil {
189-
maxServerSendMsgSize = protocolConf.TripleConfig.MaxServerSendMsgSize
190-
maxServerRecvMsgSize = protocolConf.TripleConfig.MaxServerRecvMsgSize
192+
if protocolConf.TripleConfig.MaxServerSendMsgSize != "" {
193+
maxServerSendMsgSize = protocolConf.TripleConfig.MaxServerSendMsgSize
194+
}
195+
if protocolConf.TripleConfig.MaxServerRecvMsgSize != "" {
196+
maxServerRecvMsgSize = protocolConf.TripleConfig.MaxServerRecvMsgSize
197+
}
191198
}
192199

193200
ivkURL := common.NewURLWithOptions(

0 commit comments

Comments
 (0)