From fc05db243398cc8afdfbfbe3f790602159e288ca Mon Sep 17 00:00:00 2001 From: Colin Lyons Date: Sat, 24 Dec 2022 15:31:58 +0000 Subject: [PATCH] Adding shutdown for the server. --- cmd/indra/handlers.go | 1 + cmd/indra/main.go | 5 ++- go.mod | 1 + go.sum | 2 + pkg/server/server.go | 99 ++++++++++++++++++++++++++----------------- 5 files changed, 68 insertions(+), 40 deletions(-) diff --git a/cmd/indra/handlers.go b/cmd/indra/handlers.go index 08cb8edd..4ccdc374 100644 --- a/cmd/indra/handlers.go +++ b/cmd/indra/handlers.go @@ -19,6 +19,7 @@ var versionHandler = func(c *cmds.Command, args []string) error { var serveHandler = func(c *cmds.Command, args []string) error { + log.I.Ln("running serve.") var err error diff --git a/cmd/indra/main.go b/cmd/indra/main.go index 935cf78d..b777d7aa 100644 --- a/cmd/indra/main.go +++ b/cmd/indra/main.go @@ -16,7 +16,7 @@ func main() { log2.App = "indra" - log.I.Ln("indra - the indra network tool") + log.I.Ln("-- indra - the indra network tool --") log.I.Ln("version:", indra.SemVer) var err error @@ -30,5 +30,6 @@ func main() { os.Exit(1) } - log.D.Ln("Shutdown complete.") + log.I.Ln("-- fin --") + os.Exit(0) } diff --git a/go.mod b/go.mod index 4b5dfc80..4904f2ff 100644 --- a/go.mod +++ b/go.mod @@ -52,6 +52,7 @@ require ( github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect + github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect github.com/klauspost/compress v1.15.12 // indirect github.com/klauspost/cpuid/v2 v2.2.1 // indirect diff --git a/go.sum b/go.sum index 7008c046..31cc67c4 100644 --- a/go.sum +++ b/go.sum @@ -275,6 +275,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= diff --git a/pkg/server/server.go b/pkg/server/server.go index c93969b8..31281f27 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -3,23 +3,23 @@ package server import ( "context" "github.com/Indra-Labs/indra" + "github.com/cybriq/proc/pkg/interrupt" log2 "github.com/cybriq/proc/pkg/log" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p/core" + dht "github.com/libp2p/go-libp2p-kad-dht" "github.com/libp2p/go-libp2p/core/host" "github.com/multiformats/go-multiaddr" - dht "github.com/libp2p/go-libp2p-kad-dht" ) var ( - log = log2.GetLogger(indra.PathBase) - check = log.E.Chk + log = log2.GetLogger(indra.PathBase) + check = log.E.Chk ) -var DefaultServerConfig = Config { +var DefaultServerConfig = Config{ ListenAddresses: []multiaddr.Multiaddr{NewMultiAddrForced("/ip4/127.0.0.1/tcp/8337")}, - SeedAddresses: []multiaddr.Multiaddr{}, + SeedAddresses: []multiaddr.Multiaddr{}, } func NewMultiAddrForced(addr string) multiaddr.Multiaddr { @@ -30,64 +30,87 @@ func NewMultiAddrForced(addr string) multiaddr.Multiaddr { } type Config struct { - ListenAddresses []multiaddr.Multiaddr - SeedAddresses []multiaddr.Multiaddr - + SeedAddresses []multiaddr.Multiaddr } type Server struct { - + context.Context host host.Host - dht *dht.IpfsDHT + dht *dht.IpfsDHT } -func (srv * Server) Serve() (err error) { +func (srv *Server) Serve() (err error) { + + // Bootstrap the DHT. In the default configuration, this spawns a Background + // thread that will refresh the peer table every five minutes. + if err = srv.dht.Bootstrap(srv.Context); check(err) { + return err + } + + select { + case <-srv.Context.Done(): + srv.Shutdown() + } + + return nil +} + +func (srv *Server) Restart() (err error) { + + log.I.Ln("restarting the server.") + + return nil +} + +func (srv *Server) Shutdown() (err error) { + + log.I.Ln("shutting down the dht...") + + if srv.dht.Close(); check(err) { + return + } + + log.I.Ln("shutting down the p2p host...") + + if srv.host.Close(); check(err) { + return + } + + log.I.Ln("shutdown complete.") + return nil } func New(config Config) (srv *Server, err error) { - // Start a new p2p host for the current node. - log.D.Ln("generating a new p2p host.") + log.I.Ln("initializing the server.") - log.I.Ln("p2p listeners:") - for _, addr := range config.ListenAddresses { - log.I.Ln("-", addr.String()) - } + var s Server + var cancel context.CancelFunc - var p2pHost core.Host - p2pHost, err = libp2p.New(libp2p.ListenAddrs(config.ListenAddresses...)) + s.Context, cancel = context.WithCancel(context.Background()) - if err != nil { + // Add an interrupt handler for the server shutdown + interrupt.AddHandler(cancel) + + if s.host, err = libp2p.New(libp2p.ListenAddrs(config.ListenAddresses...)); check(err) { return nil, err } + log.I.Ln("p2p listeners:") + log.I.Ln("-", s.host.Addrs()) + log.I.Ln("host id:") - log.I.Ln("-", p2pHost.ID()) + log.I.Ln("-", s.host.ID()) // Start a DHT, for use in peer discovery. We can't just make a new DHT // client because we want each peer to maintain its own local copy of the // DHT, so that the bootstrapping node of the DHT can go down without // inhibiting future peer discovery. - ctx := context.Background() - - var kaDHT *dht.IpfsDHT - - if kaDHT, err = dht.New(ctx, p2pHost); err != nil { + if s.dht, err = dht.New(s.Context, s.host); check(err) { return nil, err } - // Bootstrap the DHT. In the default configuration, this spawns a Background - // thread that will refresh the peer table every five minutes. - if err = kaDHT.Bootstrap(ctx); err != nil { - return nil, err - } - - s := Server { - host: p2pHost, - dht: kaDHT, - } - return &s, err }