summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2016-05-23 09:24:23 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2016-05-23 09:24:23 +0900
commit90c8306a9c09823924e1a8b867a09c370c741722 (patch)
tree45e43705617997ee5ab7b8dc74428cf5941d7856
parent42ab0376359f1ee378958b7ae37eaf8fbc7a811b (diff)
server: handle grpc Serve() error
Serve() returns when accept() failed. After that, gobgp stop listening on grpc port (no more grpc request). This patch makes sure that gobgp starts listening on grpc port again. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--server/grpc_server.go37
1 files changed, 26 insertions, 11 deletions
diff --git a/server/grpc_server.go b/server/grpc_server.go
index e2757d87..c2669da9 100644
--- a/server/grpc_server.go
+++ b/server/grpc_server.go
@@ -25,6 +25,7 @@ import (
"io"
"net"
"strings"
+ "sync"
)
const (
@@ -106,20 +107,34 @@ type Server struct {
}
func (s *Server) Serve() error {
+ var wg sync.WaitGroup
l := strings.Split(s.hosts, ",")
- for i, host := range l {
- lis, err := net.Listen("tcp", fmt.Sprintf(host))
- if err != nil {
- return fmt.Errorf("failed to listen: %v", err)
- }
- if i == len(l)-1 {
- s.grpcServer.Serve(lis)
- } else {
- go func() {
- s.grpcServer.Serve(lis)
- }()
+ wg.Add(len(l))
+
+ serve := func(host string) {
+ for {
+ defer wg.Done()
+ lis, err := net.Listen("tcp", fmt.Sprintf(host))
+ if err != nil {
+ log.WithFields(log.Fields{
+ "Topic": "grpc",
+ "Key": host,
+ "Error": err,
+ }).Warn("listen failed")
+ return
+ }
+ err = s.grpcServer.Serve(lis)
+ log.WithFields(log.Fields{
+ "Topic": "grpc",
+ "Key": host,
+ "Error": err,
+ }).Warn("accept failed")
}
}
+ for _, host := range l {
+ go serve(host)
+ }
+ wg.Wait()
return nil
}