Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 109 additions & 1 deletion dubbo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import (
import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"gopkg.in/yaml.v3"
)

import (
Expand Down Expand Up @@ -314,7 +316,113 @@ func TestInstanceInitAddsDefaultGlobalProtocolWhenEmpty(t *testing.T) {
require.NotNil(t, tri)
assert.Equal(t, constant.TriProtocol, tri.Name)
assert.Equal(t, constant.DefaultTripleProtocolPort, tri.Port)
assert.Equal(t, "4mib", tri.MaxServerRecvMsgSize)
require.NotNil(t, tri.TripleConfig)
assert.Equal(t, "4mib", tri.TripleConfig.MaxServerRecvMsgSize)
}

func TestInstanceInitDefaultsExplicitTripleConfig(t *testing.T) {
ins, err := NewInstance(func(opts *InstanceOptions) {
opts.Protocols = map[string]*global.ProtocolConfig{
constant.TriProtocol: {
TripleConfig: &global.TripleConfig{},
},
}
})
require.NoError(t, err)

tri := ins.insOpts.Protocols[constant.TriProtocol]
require.NotNil(t, tri)
require.NotNil(t, tri.TripleConfig)
assert.Equal(t, "4mib", tri.TripleConfig.MaxServerRecvMsgSize)
}

func TestInstanceInitMigratesDeprecatedProtocolMessageSizes(t *testing.T) {
tests := []struct {
name string
protocol *global.ProtocolConfig
wantLegacySend string
wantLegacyRecv string
wantNestedSend string
wantNestedRecv string
}{
{
name: "deprecated values populate empty nested values",
protocol: &global.ProtocolConfig{
MaxServerSendMsgSize: "2mib",
MaxServerRecvMsgSize: "3mib",
TripleConfig: &global.TripleConfig{},
},
wantLegacySend: "2mib",
wantLegacyRecv: "3mib",
wantNestedSend: "2mib",
wantNestedRecv: "3mib",
},
{
name: "nested values take precedence",
protocol: &global.ProtocolConfig{
MaxServerSendMsgSize: "2mib",
MaxServerRecvMsgSize: "3mib",
TripleConfig: &global.TripleConfig{
MaxServerSendMsgSize: "5mib",
MaxServerRecvMsgSize: "6mib",
},
},
wantLegacySend: "2mib",
wantLegacyRecv: "3mib",
wantNestedSend: "5mib",
wantNestedRecv: "6mib",
},
{
name: "empty values use defaults",
protocol: &global.ProtocolConfig{},
wantLegacyRecv: "4mib",
wantNestedRecv: "4mib",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ins, err := NewInstance(func(opts *InstanceOptions) {
opts.Protocols = map[string]*global.ProtocolConfig{
constant.TriProtocol: tt.protocol,
}
})
require.NoError(t, err)

tri := ins.insOpts.Protocols[constant.TriProtocol]
require.NotNil(t, tri)
require.NotNil(t, tri.TripleConfig)
assert.Equal(t, tt.wantLegacySend, tri.MaxServerSendMsgSize)
assert.Equal(t, tt.wantLegacyRecv, tri.MaxServerRecvMsgSize)
assert.Equal(t, tt.wantNestedSend, tri.TripleConfig.MaxServerSendMsgSize)
assert.Equal(t, tt.wantNestedRecv, tri.TripleConfig.MaxServerRecvMsgSize)
})
}
}

func TestInstanceInitMigratesDeprecatedProtocolMessageSizesFromYAML(t *testing.T) {
var protocols map[string]*global.ProtocolConfig
err := yaml.Unmarshal([]byte(`
tri:
name: tri
max-server-send-msg-size: 2mib
max-server-recv-msg-size: 3mib
triple: {}
`), &protocols)
require.NoError(t, err)

ins, err := NewInstance(func(opts *InstanceOptions) {
opts.Protocols = protocols
})
require.NoError(t, err)

tri := ins.insOpts.Protocols[constant.TriProtocol]
require.NotNil(t, tri)
require.NotNil(t, tri.TripleConfig)
assert.Equal(t, "2mib", tri.MaxServerSendMsgSize)
assert.Equal(t, "3mib", tri.MaxServerRecvMsgSize)
assert.Equal(t, "2mib", tri.TripleConfig.MaxServerSendMsgSize)
assert.Equal(t, "3mib", tri.TripleConfig.MaxServerRecvMsgSize)
}

func TestInstanceInitTranslatesGlobalRegistryAddress(t *testing.T) {
Expand Down
26 changes: 24 additions & 2 deletions global/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1002,7 +1002,7 @@ func TestProtocolConfigClone(t *testing.T) {
Ip: "localhost",
Port: "20880",
MaxServerSendMsgSize: "1mb",
MaxServerRecvMsgSize: "4mb",
MaxServerRecvMsgSize: "3mb",
TripleConfig: &TripleConfig{
MaxServerSendMsgSize: "2mb",
MaxServerRecvMsgSize: "4mb",
Expand All @@ -1026,6 +1026,8 @@ func TestProtocolConfigClone(t *testing.T) {
assert.NotSame(t, proto, cloned)
assert.NotSame(t, proto.TripleConfig, cloned.TripleConfig)
assert.NotNil(t, cloned.TripleConfig)
assert.Equal(t, "2mb", cloned.TripleConfig.MaxServerSendMsgSize)
assert.Equal(t, "4mb", cloned.TripleConfig.MaxServerRecvMsgSize)
})

t.Run("clone_nil_protocol_config", func(t *testing.T) {
Expand All @@ -1044,18 +1046,20 @@ func TestProtocolConfigClone(t *testing.T) {
assert.Equal(t, "dubbo", cloned.Name)
})

t.Run("clone_protocol_config_preserves_all_fields", func(t *testing.T) {
t.Run("clone_protocol_config_preserves_protocol_fields", func(t *testing.T) {
proto := &ProtocolConfig{
Name: "http",
Ip: "localhost",
Port: "8080",
Params: map[string]string{"key": "value"},
MaxServerSendMsgSize: "10mb",
MaxServerRecvMsgSize: "10mb",
}
cloned := proto.Clone()
assert.Equal(t, "http", cloned.Name)
assert.Equal(t, "localhost", cloned.Ip)
assert.Equal(t, "8080", cloned.Port)
assert.Equal(t, proto.Params, cloned.Params)
assert.Equal(t, "10mb", cloned.MaxServerSendMsgSize)
assert.Equal(t, "10mb", cloned.MaxServerRecvMsgSize)
})
Expand All @@ -1075,6 +1079,21 @@ func TestDefaultProtocolConfig(t *testing.T) {

// TestProtocolConfigFields tests individual fields of ProtocolConfig
func TestProtocolConfigFields(t *testing.T) {
t.Run("deprecated_triple_fields_remain_available_in_v3", func(t *testing.T) {
protocolType := reflect.TypeFor[ProtocolConfig]()
_, hasSendSize := protocolType.FieldByName("MaxServerSendMsgSize")
_, hasRecvSize := protocolType.FieldByName("MaxServerRecvMsgSize")
assert.True(t, hasSendSize)
assert.True(t, hasRecvSize)

proto := ProtocolConfig{
MaxServerSendMsgSize: "1mib",
MaxServerRecvMsgSize: "2mib",
}
assert.Equal(t, "1mib", proto.MaxServerSendMsgSize)
assert.Equal(t, "2mib", proto.MaxServerRecvMsgSize)
})

t.Run("protocol_config_name", func(t *testing.T) {
proto := &ProtocolConfig{Name: "dubbo"}
assert.Equal(t, "dubbo", proto.Name)
Expand Down Expand Up @@ -1158,7 +1177,10 @@ func TestDefaultTripleConfig(t *testing.T) {
t.Run("default_triple_config", func(t *testing.T) {
triple := DefaultTripleConfig()
assert.NotNil(t, triple)
assert.Equal(t, "4mib", triple.MaxServerRecvMsgSize)
assert.NotNil(t, triple.Http3)
assert.NotNil(t, triple.Cors)
assert.NotNil(t, triple.OpenAPI)
})
}

Expand Down
4 changes: 2 additions & 2 deletions global/protocol_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ type ProtocolConfig struct {
// MaxServerSendMsgSize defines the max size of server send message, 1mb=1000kb=1000000b 1mib=1024kb=1048576b.
// more detail to see https://pkg.go.dev/github.com/dustin/go-humanize#pkg-constants
//
// Deprecated: use "ClientProtocolConfig.TripleConfig.MaxServerSendMsgSize" or in config tag "protocol_config/triple/max-server-send-msg-size" instead
// Deprecated: use TripleConfig.MaxServerSendMsgSize or the "triple/max-server-send-msg-size" config key instead.
MaxServerSendMsgSize string `yaml:"max-server-send-msg-size" json:"max-server-send-msg-size,omitempty"`
Comment thread
EmptyCity-111 marked this conversation as resolved.
// TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when version 4.0.0
//
// MaxServerRecvMsgSize defines the max size of server receive message.
//
// Deprecated: use "ClientProtocolConfig.TripleConfig.MaxServerRecvMsgSize" or in config tag "protocol_config/triple/max-server-recv-msg-size" instead
// Deprecated: use TripleConfig.MaxServerRecvMsgSize or the "triple/max-server-recv-msg-size" config key instead.
MaxServerRecvMsgSize string `default:"4mib" yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
}

Expand Down
9 changes: 5 additions & 4 deletions global/triple_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ type TripleConfig struct {
// more detail to see https://pkg.go.dev/github.com/dustin/go-humanize#pkg-constants
MaxServerSendMsgSize string `yaml:"max-server-send-msg-size" json:"max-server-send-msg-size,omitempty"`
// MaxServerRecvMsgSize defines the max size of server receive message.
MaxServerRecvMsgSize string `yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
MaxServerRecvMsgSize string `default:"4mib" yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
// Http3 holds the HTTP/3 transport configuration.
Http3 *Http3Config `yaml:"http3" json:"http3,omitempty"`
// Cors configures CORS for Triple protocol handlers.
Expand All @@ -48,9 +48,10 @@ type TripleConfig struct {
// DefaultTripleConfig returns a default TripleConfig instance.
func DefaultTripleConfig() *TripleConfig {
return &TripleConfig{
Http3: DefaultHttp3Config(),
Cors: DefaultCorsConfig(),
OpenAPI: DefaultOpenAPIConfig(),
MaxServerRecvMsgSize: "4mib",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move this 4mib to common/const

Http3: DefaultHttp3Config(),
Cors: DefaultCorsConfig(),
OpenAPI: DefaultOpenAPIConfig(),
}
}

Expand Down
14 changes: 14 additions & 0 deletions instance_options_init.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,12 @@
return nil
}

func initGlobalProtocol(protocolConfig *global.ProtocolConfig) error {

Check failure on line 142 in instance_options_init.go

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this method to reduce its Cognitive Complexity from 17 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=apache_dubbo-go&issues=AZ_lHHeS0FCPfX5GVHYy&open=AZ_lHHeS0FCPfX5GVHYy&pullRequest=3613
legacySendMsgSize := protocolConfig.MaxServerSendMsgSize
legacyRecvMsgSize := protocolConfig.MaxServerRecvMsgSize
nestedSendMsgSizeSet := protocolConfig.TripleConfig != nil && protocolConfig.TripleConfig.MaxServerSendMsgSize != ""
nestedRecvMsgSizeSet := protocolConfig.TripleConfig != nil && protocolConfig.TripleConfig.MaxServerRecvMsgSize != ""

if err := defaults.Set(protocolConfig); err != nil {
return err
}
Expand All @@ -163,6 +168,15 @@
}
protocolConfig.TripleConfig.OpenAPI.Init()
}

// Keep v3 configurations source-compatible while converging on TripleConfig.
// A non-empty nested value wins; otherwise migrate the deprecated value.
if !nestedSendMsgSizeSet && legacySendMsgSize != "" {
protocolConfig.TripleConfig.MaxServerSendMsgSize = legacySendMsgSize
}
if !nestedRecvMsgSizeSet && legacyRecvMsgSize != "" {
protocolConfig.TripleConfig.MaxServerRecvMsgSize = legacyRecvMsgSize
}
return commonCfg.Verify(protocolConfig)
}

Expand Down
21 changes: 16 additions & 5 deletions server/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,19 @@ func (svcOpts *ServiceOptions) Export() error {
isIDL = svcOpts.IDLMode
}

// Keep accepting the deprecated protocol-level fields through v3. Nested
// Triple values take precedence when both forms are configured.
maxServerSendMsgSize := protocolConf.MaxServerSendMsgSize
maxServerRecvMsgSize := protocolConf.MaxServerRecvMsgSize
if protocolConf.TripleConfig != nil {
if protocolConf.TripleConfig.MaxServerSendMsgSize != "" {
maxServerSendMsgSize = protocolConf.TripleConfig.MaxServerSendMsgSize
}
if protocolConf.TripleConfig.MaxServerRecvMsgSize != "" {
maxServerRecvMsgSize = protocolConf.TripleConfig.MaxServerRecvMsgSize
}
}

ivkURL := common.NewURLWithOptions(
common.WithPath(svcConf.Interface),
common.WithProtocol(protocolConf.Name),
Expand All @@ -201,11 +214,9 @@ func (svcOpts *ServiceOptions) Export() error {
common.WithToken(svcConf.Token),
common.WithParamsValue(constant.MetadataTypeKey, svcOpts.metadataType),

// fix https://github.com/apache/dubbo-go/issues/2176
// TODO: remove MaxServerSendMsgSize value and MaxServerRecvMsgSize value when version 4.0.0
Comment on lines -204 to -205

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

keep this todo

// use TripleConfig to transport arguments
common.WithParamsValue(constant.MaxServerSendMsgSize, protocolConf.MaxServerSendMsgSize),
common.WithParamsValue(constant.MaxServerRecvMsgSize, protocolConf.MaxServerRecvMsgSize),
// Preserve the legacy URL parameters for downstream protocol compatibility.
common.WithParamsValue(constant.MaxServerSendMsgSize, maxServerSendMsgSize),
Comment thread
EmptyCity-111 marked this conversation as resolved.
common.WithParamsValue(constant.MaxServerRecvMsgSize, maxServerRecvMsgSize),

// TODO: remove IDL value when version 4.0.0
common.WithParamsValue(constant.IDLMode, isIDL),
Expand Down
Loading
Loading