Adding shutdown for the server.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
1
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
|
||||
|
||||
2
go.sum
2
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=
|
||||
|
||||
@@ -3,12 +3,12 @@ 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 (
|
||||
@@ -30,64 +30,87 @@ func NewMultiAddrForced(addr string) multiaddr.Multiaddr {
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
|
||||
ListenAddresses []multiaddr.Multiaddr
|
||||
SeedAddresses []multiaddr.Multiaddr
|
||||
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
|
||||
context.Context
|
||||
host host.Host
|
||||
dht *dht.IpfsDHT
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user