Move grpc.Server creation into initializer

This fixes an issue with the grpc-web middleware using a nil
grpc.Server instance.
This commit is contained in:
Cody Soyland 2020-10-08 15:08:57 -05:00
parent 04b1152224
commit 31cd119a7e
2 changed files with 30 additions and 27 deletions

View file

@ -1178,9 +1178,9 @@ func fieldDataType(f *pilosa.Field) string {
type grpcServer struct {
api *pilosa.API
mu sync.Mutex
grpcServer *grpc.Server
ln net.Listener
tlsConfig *tls.Config
logger logger.Logger
stats stats.StatsClient
@ -1202,6 +1202,13 @@ func OptGRPCServerListener(ln net.Listener) grpcServerOption {
}
}
func OptGRPCServerTLSConfig(tlsConfig *tls.Config) grpcServerOption {
return func(s *grpcServer) error {
s.tlsConfig = tlsConfig
return nil
}
}
func OptGRPCServerLogger(logger logger.Logger) grpcServerOption {
return func(s *grpcServer) error {
s.logger = logger
@ -1216,26 +1223,9 @@ func OptGRPCServerStats(stats stats.StatsClient) grpcServerOption {
}
}
func (s *grpcServer) Serve(tlsConfig *tls.Config) error {
func (s *grpcServer) Serve() error {
s.logger.Printf("enabled grpc listening on %s", s.ln.Addr())
opts := make([]grpc.ServerOption, 0)
if tlsConfig != nil {
creds := credentials.NewTLS(tlsConfig)
opts = append(opts, grpc.Creds(creds))
}
// create grpc server
s.mu.Lock()
s.grpcServer = grpc.NewServer(opts...)
grpcHandler := NewGRPCHandler(s.api).WithLogger(s.logger).WithStats(s.stats)
pb.RegisterPilosaServer(s.grpcServer, grpcHandler)
vdsm_pb.RegisterMoleculaServer(s.grpcServer, NewVDSMGRPCHandler(grpcHandler, s.api).WithLogger(s.logger).WithStats(s.stats))
// register the server so its services are available to grpc_cli and others
reflection.Register(s.grpcServer)
s.mu.Unlock()
// and start...
if err := s.grpcServer.Serve(s.ln); err != nil {
return errors.Wrap(err, "starting grpc server")
@ -1243,7 +1233,7 @@ func (s *grpcServer) Serve(tlsConfig *tls.Config) error {
return nil
}
func (s *grpcServer) Middleware(origins []string) func(http.Handler) http.Handler {
func (s *grpcServer) middleware(origins []string) func(http.Handler) http.Handler {
httpOriginFunc := grpcweb.WithOriginFunc(func(origin string) bool {
for _, x := range origins {
if origin == x {
@ -1269,11 +1259,7 @@ func (s *grpcServer) Middleware(origins []string) func(http.Handler) http.Handle
// Stop stops the GRPC server. There's no error because the underlying GRPC
// stuff doesn't report an error.
func (s *grpcServer) Stop() {
s.mu.Lock()
defer s.mu.Unlock()
if s.grpcServer != nil {
s.grpcServer.Stop()
}
s.grpcServer.Stop()
}
func NewGRPCServer(opts ...grpcServerOption) (*grpcServer, error) {
@ -1286,5 +1272,21 @@ func NewGRPCServer(opts ...grpcServerOption) (*grpcServer, error) {
return nil, errors.Wrap(err, "applying option")
}
}
gopts := make([]grpc.ServerOption, 0)
if server.tlsConfig != nil {
creds := credentials.NewTLS(server.tlsConfig)
gopts = append(gopts, grpc.Creds(creds))
}
// create grpc server
server.grpcServer = grpc.NewServer(gopts...)
grpcHandler := NewGRPCHandler(server.api).WithLogger(server.logger).WithStats(server.stats)
pb.RegisterPilosaServer(server.grpcServer, grpcHandler)
vdsm_pb.RegisterMoleculaServer(server.grpcServer, NewVDSMGRPCHandler(grpcHandler, server.api).WithLogger(server.logger).WithStats(server.stats))
// register the server so its services are available to grpc_cli and others
reflection.Register(server.grpcServer)
return server, nil
}

View file

@ -171,7 +171,7 @@ func (m *Command) Start() (err error) {
m.logger.Printf("listening as %s\n", m.listenURI)
go func() {
if err := m.grpcServer.Serve(m.tlsConfig); err != nil {
if err := m.grpcServer.Serve(); err != nil {
m.logger.Printf("grpc server error: %v", err)
}
}()
@ -432,6 +432,7 @@ func (m *Command) SetupServer() error {
m.grpcServer, err = NewGRPCServer(
OptGRPCServerAPI(m.API),
OptGRPCServerListener(m.grpcLn),
OptGRPCServerTLSConfig(m.tlsConfig),
OptGRPCServerLogger(m.logger),
OptGRPCServerStats(statsClient),
)
@ -446,7 +447,7 @@ func (m *Command) SetupServer() error {
http.OptHandlerFileSystem(&statik.FileSystem{}),
http.OptHandlerListener(m.ln),
http.OptHandlerCloseTimeout(m.closeTimeout),
http.OptHandlerMiddleware(m.grpcServer.Middleware(m.Config.Handler.AllowedOrigins)),
http.OptHandlerMiddleware(m.grpcServer.middleware(m.Config.Handler.AllowedOrigins)),
)
return errors.Wrap(err, "new handler")
}