Skip to content
Snippets Groups Projects
Commit 19da02b9 authored by ale's avatar ale
Browse files

Properly stop all services on error, and improve logging

parent 49d17654
No related branches found
No related tags found
1 merge request!1v2.0
...@@ -203,16 +203,22 @@ func ednsFromRequest(req, m *dns.Msg) { ...@@ -203,16 +203,22 @@ func ednsFromRequest(req, m *dns.Msg) {
// Wrapper to make the dns.Server match the genericServer interface. // Wrapper to make the dns.Server match the genericServer interface.
type dnsServer struct { type dnsServer struct {
*dns.Server *dns.Server
name string
} }
func newDNSServer(addr, proto string, h dns.Handler) *dnsServer { func newDNSServer(name, addr, proto string, h dns.Handler) *dnsServer {
return &dnsServer{&dns.Server{ return &dnsServer{
Addr: addr, Server: &dns.Server{
Net: proto, Addr: addr,
Handler: h, Net: proto,
}} Handler: h,
},
name: name,
}
} }
func (s *dnsServer) Name() string { return s.name }
func (s *dnsServer) Serve() error { func (s *dnsServer) Serve() error {
return s.Server.ListenAndServe() return s.Server.ListenAndServe()
} }
......
...@@ -246,19 +246,25 @@ func withLocalhost(h http.Handler) http.Handler { ...@@ -246,19 +246,25 @@ func withLocalhost(h http.Handler) http.Handler {
// Wrapper to make an http.Server match the genericServer interface. // Wrapper to make an http.Server match the genericServer interface.
type httpServer struct { type httpServer struct {
*http.Server *http.Server
name string
} }
func newHTTPServer(addr string, h http.Handler) *httpServer { func newHTTPServer(name, addr string, h http.Handler) *httpServer {
return &httpServer{&http.Server{ return &httpServer{
Addr: addr, Server: &http.Server{
Handler: h, Addr: addr,
ReadTimeout: 10 * time.Second, Handler: h,
ReadHeaderTimeout: 3 * time.Second, ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second, ReadHeaderTimeout: 3 * time.Second,
IdleTimeout: 30 * time.Second, WriteTimeout: 10 * time.Second,
}} IdleTimeout: 30 * time.Second,
},
name: name,
}
} }
func (s *httpServer) Name() string { return s.name }
func (s *httpServer) Serve() error { func (s *httpServer) Serve() error {
err := s.Server.ListenAndServe() err := s.Server.ListenAndServe()
if err == http.ErrServerClosed { if err == http.ErrServerClosed {
......
...@@ -2,6 +2,7 @@ package node ...@@ -2,6 +2,7 @@ package node
import ( import (
"fmt" "fmt"
"log"
"net" "net"
"strconv" "strconv"
"sync" "sync"
...@@ -9,6 +10,7 @@ import ( ...@@ -9,6 +10,7 @@ import (
// A genericServer is just something that can be started and stopped. // A genericServer is just something that can be started and stopped.
type genericServer interface { type genericServer interface {
Name() string
Serve() error Serve() error
Stop() Stop()
} }
...@@ -33,10 +35,14 @@ func buildServer(servers ...genericServer) *Server { ...@@ -33,10 +35,14 @@ func buildServer(servers ...genericServer) *Server {
ms.wg.Add(1) ms.wg.Add(1)
go func(s genericServer) { go func(s genericServer) {
defer ms.wg.Done() defer ms.wg.Done()
log.Printf("starting network service: %s", s.Name())
err := s.Serve() err := s.Serve()
if err != nil { if err != nil {
werr := fmt.Errorf("%s: %v", s.Name(), err)
select { select {
case ms.errCh <- err: case ms.errCh <- werr:
// First error, stop all other services.
ms.Stop()
default: default:
} }
} }
...@@ -78,13 +84,13 @@ func NewServer(n *Node, domain string, nameservers []string, publicAddrs []net.I ...@@ -78,13 +84,13 @@ func NewServer(n *Node, domain string, nameservers []string, publicAddrs []net.I
servers := []genericServer{ servers := []genericServer{
newStatusServer(mkaddr(peerAddr, gossipPort), n.statusMgr), newStatusServer(mkaddr(peerAddr, gossipPort), n.statusMgr),
newHTTPServer(fmt.Sprintf(":%d", metricsPort), newMetricsHandler()), newHTTPServer("metrics", fmt.Sprintf(":%d", metricsPort), newMetricsHandler()),
} }
for _, ip := range publicAddrs { for _, ip := range publicAddrs {
servers = append(servers, servers = append(servers,
newHTTPServer(mkaddr(ip, httpPort), httpHandler), newHTTPServer("main", mkaddr(ip, httpPort), httpHandler),
newDNSServer(mkaddr(ip, dnsPort), "udp", dnsHandler), newDNSServer("dns(udp)", mkaddr(ip, dnsPort), "udp", dnsHandler),
newDNSServer(mkaddr(ip, dnsPort), "tcp", dnsHandler), newDNSServer("dns(tcp)", mkaddr(ip, dnsPort), "tcp", dnsHandler),
) )
} }
return buildServer(servers...) return buildServer(servers...)
......
...@@ -185,6 +185,8 @@ func newStatusServer(addr string, statusMgr *statusManager) *statusServer { ...@@ -185,6 +185,8 @@ func newStatusServer(addr string, statusMgr *statusManager) *statusServer {
} }
} }
func (s *statusServer) Name() string { return "status" }
func (s *statusServer) Serve() error { func (s *statusServer) Serve() error {
l, err := net.Listen("tcp", s.addr) l, err := net.Listen("tcp", s.addr)
if err != nil { if err != nil {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment