internal: add global DialOptions and ServerOptions for all clients and servers (#5352)
This commit is contained in:
@ -146,6 +146,10 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
|||||||
cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil})
|
cc.safeConfigSelector.UpdateConfigSelector(&defaultConfigSelector{nil})
|
||||||
cc.ctx, cc.cancel = context.WithCancel(context.Background())
|
cc.ctx, cc.cancel = context.WithCancel(context.Background())
|
||||||
|
|
||||||
|
for _, opt := range extraDialOptions {
|
||||||
|
opt.apply(&cc.dopts)
|
||||||
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.apply(&cc.dopts)
|
opt.apply(&cc.dopts)
|
||||||
}
|
}
|
||||||
|
82
default_dial_option_server_option_test.go
Normal file
82
default_dial_option_server_option_test.go
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2022 gRPC authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
|
"google.golang.org/grpc/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s) TestAddExtraDialOptions(t *testing.T) {
|
||||||
|
// Ensure the Dial fails without credentials
|
||||||
|
if _, err := Dial("fake"); err == nil {
|
||||||
|
t.Fatalf("Dialing without a credential did not fail")
|
||||||
|
} else {
|
||||||
|
if !strings.Contains(err.Error(), "no transport security set") {
|
||||||
|
t.Fatalf("Dialing failed with unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set and check the DialOptions
|
||||||
|
opts := []DialOption{WithTransportCredentials(insecure.NewCredentials()), WithTransportCredentials(insecure.NewCredentials()), WithTransportCredentials(insecure.NewCredentials())}
|
||||||
|
internal.AddExtraDialOptions.(func(opt ...DialOption))(opts...)
|
||||||
|
for i, opt := range opts {
|
||||||
|
if extraDialOptions[i] != opt {
|
||||||
|
t.Fatalf("Unexpected extra dial option at index %d: %v != %v", i, extraDialOptions[i], opt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the Dial passes with the extra dial options
|
||||||
|
if cc, err := Dial("fake"); err != nil {
|
||||||
|
t.Fatalf("Dialing with insecure credential failed: %v", err)
|
||||||
|
} else {
|
||||||
|
cc.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal.ClearExtraDialOptions()
|
||||||
|
if len(extraDialOptions) != 0 {
|
||||||
|
t.Fatalf("Unexpected len of extraDialOptions: %d != 0", len(extraDialOptions))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s) TestAddExtraServerOptions(t *testing.T) {
|
||||||
|
const maxRecvSize = 998765
|
||||||
|
// Set and check the ServerOptions
|
||||||
|
opts := []ServerOption{StatsHandler(nil), Creds(insecure.NewCredentials()), MaxRecvMsgSize(maxRecvSize)}
|
||||||
|
internal.AddExtraServerOptions.(func(opt ...ServerOption))(opts...)
|
||||||
|
for i, opt := range opts {
|
||||||
|
if extraServerOptions[i] != opt {
|
||||||
|
t.Fatalf("Unexpected extra server option at index %d: %v != %v", i, extraServerOptions[i], opt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the extra server options applies to new servers
|
||||||
|
s := NewServer()
|
||||||
|
if s.opts.maxReceiveMessageSize != maxRecvSize {
|
||||||
|
t.Fatalf("Unexpected s.opts.maxReceiveMessageSize: %d != %d", s.opts.maxReceiveMessageSize, maxRecvSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal.ClearExtraServerOptions()
|
||||||
|
if len(extraServerOptions) != 0 {
|
||||||
|
t.Fatalf("Unexpected len of extraServerOptions: %d != 0", len(extraServerOptions))
|
||||||
|
}
|
||||||
|
}
|
@ -35,6 +35,15 @@ import (
|
|||||||
"google.golang.org/grpc/stats"
|
"google.golang.org/grpc/stats"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
internal.AddExtraDialOptions = func(opt ...DialOption) {
|
||||||
|
extraDialOptions = append(extraDialOptions, opt...)
|
||||||
|
}
|
||||||
|
internal.ClearExtraDialOptions = func() {
|
||||||
|
extraDialOptions = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// dialOptions configure a Dial call. dialOptions are set by the DialOption
|
// dialOptions configure a Dial call. dialOptions are set by the DialOption
|
||||||
// values passed to Dial.
|
// values passed to Dial.
|
||||||
type dialOptions struct {
|
type dialOptions struct {
|
||||||
@ -70,6 +79,8 @@ type DialOption interface {
|
|||||||
apply(*dialOptions)
|
apply(*dialOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var extraDialOptions []DialOption
|
||||||
|
|
||||||
// EmptyDialOption does not alter the dial configuration. It can be embedded in
|
// EmptyDialOption does not alter the dial configuration. It can be embedded in
|
||||||
// another structure to build custom dial options.
|
// another structure to build custom dial options.
|
||||||
//
|
//
|
||||||
|
@ -63,6 +63,20 @@ var (
|
|||||||
// xDS-enabled server invokes this method on a grpc.Server when a particular
|
// xDS-enabled server invokes this method on a grpc.Server when a particular
|
||||||
// listener moves to "not-serving" mode.
|
// listener moves to "not-serving" mode.
|
||||||
DrainServerTransports interface{} // func(*grpc.Server, string)
|
DrainServerTransports interface{} // func(*grpc.Server, string)
|
||||||
|
// AddExtraServerOptions adds an array of ServerOption that will be
|
||||||
|
// effective globally for newly created servers. The priority will be: 1.
|
||||||
|
// user-provided; 2. this method; 3. default values.
|
||||||
|
AddExtraServerOptions interface{} // func(opt ...ServerOption)
|
||||||
|
// ClearExtraServerOptions clears the array of extra ServerOption. This
|
||||||
|
// method is useful in testing and benchmarking.
|
||||||
|
ClearExtraServerOptions func()
|
||||||
|
// AddExtraDialOptions adds an array of DialOption that will be effective
|
||||||
|
// globally for newly created client channels. The priority will be: 1.
|
||||||
|
// user-provided; 2. this method; 3. default values.
|
||||||
|
AddExtraDialOptions interface{} // func(opt ...DialOption)
|
||||||
|
// ClearExtraDialOptions clears the array of extra DialOption. This
|
||||||
|
// method is useful in testing and benchmarking.
|
||||||
|
ClearExtraDialOptions func()
|
||||||
|
|
||||||
// NewXDSResolverWithConfigForTesting creates a new xds resolver builder using
|
// NewXDSResolverWithConfigForTesting creates a new xds resolver builder using
|
||||||
// the provided xds bootstrap config instead of the global configuration from
|
// the provided xds bootstrap config instead of the global configuration from
|
||||||
|
10
server.go
10
server.go
@ -73,6 +73,12 @@ func init() {
|
|||||||
internal.DrainServerTransports = func(srv *Server, addr string) {
|
internal.DrainServerTransports = func(srv *Server, addr string) {
|
||||||
srv.drainServerTransports(addr)
|
srv.drainServerTransports(addr)
|
||||||
}
|
}
|
||||||
|
internal.AddExtraServerOptions = func(opt ...ServerOption) {
|
||||||
|
extraServerOptions = opt
|
||||||
|
}
|
||||||
|
internal.ClearExtraServerOptions = func() {
|
||||||
|
extraServerOptions = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var statusOK = status.New(codes.OK, "")
|
var statusOK = status.New(codes.OK, "")
|
||||||
@ -174,6 +180,7 @@ var defaultServerOptions = serverOptions{
|
|||||||
writeBufferSize: defaultWriteBufSize,
|
writeBufferSize: defaultWriteBufSize,
|
||||||
readBufferSize: defaultReadBufSize,
|
readBufferSize: defaultReadBufSize,
|
||||||
}
|
}
|
||||||
|
var extraServerOptions []ServerOption
|
||||||
|
|
||||||
// A ServerOption sets options such as credentials, codec and keepalive parameters, etc.
|
// A ServerOption sets options such as credentials, codec and keepalive parameters, etc.
|
||||||
type ServerOption interface {
|
type ServerOption interface {
|
||||||
@ -560,6 +567,9 @@ func (s *Server) stopServerWorkers() {
|
|||||||
// started to accept requests yet.
|
// started to accept requests yet.
|
||||||
func NewServer(opt ...ServerOption) *Server {
|
func NewServer(opt ...ServerOption) *Server {
|
||||||
opts := defaultServerOptions
|
opts := defaultServerOptions
|
||||||
|
for _, o := range extraServerOptions {
|
||||||
|
o.apply(&opts)
|
||||||
|
}
|
||||||
for _, o := range opt {
|
for _, o := range opt {
|
||||||
o.apply(&opts)
|
o.apply(&opts)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user