perf: expand gateway capacity and prevent receipt replay
This commit is contained in:
@@ -41,6 +41,10 @@ type ChannelConfig struct {
|
||||
WindowSize int `json:"windowSize,omitempty"`
|
||||
HeartbeatIntervalSeconds int `json:"heartbeatIntervalSeconds,omitempty"`
|
||||
HeartbeatMissThreshold int `json:"heartbeatMissThreshold,omitempty"`
|
||||
ConnectionWarmupSeconds int `json:"connectionWarmupSeconds,omitempty"`
|
||||
ConnectionDrainSeconds int `json:"connectionDrainTimeoutSeconds,omitempty"`
|
||||
SubmitTimeoutSeconds int `json:"submitResponseTimeoutSeconds,omitempty"`
|
||||
FailureCooldownSeconds int `json:"connectionFailureCooldownSeconds,omitempty"`
|
||||
}
|
||||
|
||||
type DisconnectChannelCommand struct {
|
||||
@@ -351,6 +355,10 @@ func (s Server) connectChannel(ctx context.Context, command ConnectChannelComman
|
||||
WindowSize: command.Channel.WindowSize,
|
||||
HeartbeatIntervalSeconds: command.Channel.HeartbeatIntervalSeconds,
|
||||
HeartbeatMissThreshold: command.Channel.HeartbeatMissThreshold,
|
||||
ConnectionWarmupSeconds: command.Channel.ConnectionWarmupSeconds,
|
||||
ConnectionDrainSeconds: command.Channel.ConnectionDrainSeconds,
|
||||
SubmitTimeoutSeconds: command.Channel.SubmitTimeoutSeconds,
|
||||
FailureCooldownSeconds: command.Channel.FailureCooldownSeconds,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
@@ -411,6 +419,12 @@ func validateConnectChannelCommand(command ConnectChannelCommand) error {
|
||||
if command.Channel.Account == "" || command.Channel.PasswordCipher == "" {
|
||||
return fmt.Errorf("account and passwordCipher are required")
|
||||
}
|
||||
if command.DesiredConnections < 1 || command.DesiredConnections > 8 {
|
||||
return fmt.Errorf("desiredConnections must be between 1 and 8")
|
||||
}
|
||||
if command.Channel.WindowSize != 0 && (command.Channel.WindowSize < 1 || command.Channel.WindowSize > 64) {
|
||||
return fmt.Errorf("windowSize must be between 1 and 64")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -140,6 +140,22 @@ func TestConnectChannelRejectsInvalidCommand(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestConnectChannelRejectsCapacityOutsideSupportedMatrix(t *testing.T) {
|
||||
handler := handlerWithConnect(func(context.Context, ConnectChannelCommand) (ConnectionStateCallback, error) {
|
||||
return ConnectionStateCallback{}, nil
|
||||
})
|
||||
for _, body := range []string{
|
||||
`{"schemaVersion":"v1","messageType":"ConnectChannel","channelId":"c","connectionId":"x","desiredConnections":9,"channel":{"gatewayHost":"127.0.0.1","gatewayPort":17890,"account":"a","passwordCipher":"p","windowSize":16}}`,
|
||||
`{"schemaVersion":"v1","messageType":"ConnectChannel","channelId":"c","connectionId":"x","desiredConnections":1,"channel":{"gatewayHost":"127.0.0.1","gatewayPort":17890,"account":"a","passwordCipher":"p","windowSize":65}}`,
|
||||
} {
|
||||
response := httptest.NewRecorder()
|
||||
handler.ServeHTTP(response, httptest.NewRequest(http.MethodPost, "/connections/connect", strings.NewReader(body)))
|
||||
if response.Code != http.StatusBadRequest {
|
||||
t.Fatalf("status=%d body=%s", response.Code, response.Body.String())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDisconnectChannelStopsSupplierPool(t *testing.T) {
|
||||
var received DisconnectChannelCommand
|
||||
handler := handlerWithServer(Server{
|
||||
|
||||
Reference in New Issue
Block a user