client/pool.go (31 lines of code) (raw):
package client
import (
"context"
"gitlab.com/gitlab-org/gitaly/v16/internal/grpc/client"
"google.golang.org/grpc"
)
// PoolOption is an option that can be passed to NewPoolWithOptions.
type PoolOption = client.PoolOption
// Dialer is used by the Pool to create a *grpc.ClientConn.
type Dialer func(ctx context.Context, address string, dialOptions []grpc.DialOption) (*grpc.ClientConn, error)
// WithDialer sets the dialer that is called for each new gRPC connection the pool establishes.
func WithDialer(dialer Dialer) PoolOption {
return client.WithDialer(client.Dialer(dialer))
}
// WithDialOptions sets gRPC options to use for the gRPC Dial call.
func WithDialOptions(dialOptions ...grpc.DialOption) PoolOption {
return client.WithDialOptions(dialOptions...)
}
// Pool is a pool of GRPC connections. Connections created by it are safe for concurrent use.
type Pool struct {
pool *client.Pool
}
// NewPool creates a new connection pool that's ready for use.
func NewPool(dialOptions ...grpc.DialOption) *Pool {
return NewPoolWithOptions(WithDialOptions(dialOptions...))
}
// NewPoolWithOptions creates a new connection pool that's ready for use.
func NewPoolWithOptions(poolOptions ...PoolOption) *Pool {
return &Pool{
pool: client.NewPool(poolOptions...),
}
}
// Dial creates a new client connection in case no connection to the given
// address exists already or returns an already established connection. The
// returned address must not be `Close()`d.
func (p *Pool) Dial(ctx context.Context, address, token string) (*grpc.ClientConn, error) {
return p.pool.Dial(ctx, address, token)
}
// Close closes all connections tracked by the connection pool.
func (p *Pool) Close() error {
return p.pool.Close()
}