From 65733b826879df7950fed3632f822f793df097b4 Mon Sep 17 00:00:00 2001 From: Milos Gajdos Date: Fri, 23 Aug 2019 15:00:29 +0100 Subject: [PATCH] Make server starts and stops idempotent --- grpc.go | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/grpc.go b/grpc.go index bb968d9..86025a9 100644 --- a/grpc.go +++ b/grpc.go @@ -53,6 +53,8 @@ type grpcServer struct { opts server.Options handlers map[string]server.Handler subscribers map[*subscriber][]broker.Subscriber + // marks the serve as started + started bool // used for first registration registered bool } @@ -454,7 +456,10 @@ func (g *grpcServer) newCodec(contentType string) (codec.NewCodec, error) { } func (g *grpcServer) Options() server.Options { + g.RLock() opts := g.opts + g.RUnlock() + return opts } @@ -700,7 +705,14 @@ func (g *grpcServer) Deregister() error { } func (g *grpcServer) Start() error { - config := g.opts + g.RLock() + if g.started { + g.RUnlock() + return nil + } + g.RUnlock() + + config := g.Options() // micro: config.Transport.Listen(config.Address) ts, err := net.Listen("tcp", config.Address) @@ -781,13 +793,32 @@ func (g *grpcServer) Start() error { config.Broker.Disconnect() }() + // mark the server as started + g.Lock() + g.started = true + g.Unlock() + return nil } func (g *grpcServer) Stop() error { + g.RLock() + if !g.started { + g.RUnlock() + return nil + } + g.RUnlock() + ch := make(chan error) g.exit <- ch - return <-ch + + var err error + select { + case err = <-ch: + g.started = false + } + + return err } func (g *grpcServer) String() string {