Adding shutdown for the server.

This commit is contained in:
Colin Lyons
2022-12-24 15:31:58 +00:00
parent 47ce7c336e
commit fc05db2433
5 changed files with 68 additions and 40 deletions

View File

@@ -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

View File

@@ -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)
}

1
go.mod
View File

@@ -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

2
go.sum
View File

@@ -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=

View File

@@ -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
}