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 {
|
var serveHandler = func(c *cmds.Command, args []string) error {
|
||||||
|
|
||||||
|
|
||||||
log.I.Ln("running serve.")
|
log.I.Ln("running serve.")
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func main() {
|
|||||||
|
|
||||||
log2.App = "indra"
|
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)
|
log.I.Ln("version:", indra.SemVer)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
@@ -30,5 +30,6 @@ func main() {
|
|||||||
os.Exit(1)
|
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-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
||||||
github.com/jbenet/goprocess v0.1.4 // 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/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect
|
||||||
github.com/klauspost/compress v1.15.12 // indirect
|
github.com/klauspost/compress v1.15.12 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.1 // 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/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.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
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 h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
|
||||||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
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=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
|
|||||||
@@ -3,23 +3,23 @@ package server
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/Indra-Labs/indra"
|
"github.com/Indra-Labs/indra"
|
||||||
|
"github.com/cybriq/proc/pkg/interrupt"
|
||||||
log2 "github.com/cybriq/proc/pkg/log"
|
log2 "github.com/cybriq/proc/pkg/log"
|
||||||
"github.com/libp2p/go-libp2p"
|
"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/libp2p/go-libp2p/core/host"
|
||||||
"github.com/multiformats/go-multiaddr"
|
"github.com/multiformats/go-multiaddr"
|
||||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
log = log2.GetLogger(indra.PathBase)
|
log = log2.GetLogger(indra.PathBase)
|
||||||
check = log.E.Chk
|
check = log.E.Chk
|
||||||
)
|
)
|
||||||
|
|
||||||
var DefaultServerConfig = Config {
|
var DefaultServerConfig = Config{
|
||||||
|
|
||||||
ListenAddresses: []multiaddr.Multiaddr{NewMultiAddrForced("/ip4/127.0.0.1/tcp/8337")},
|
ListenAddresses: []multiaddr.Multiaddr{NewMultiAddrForced("/ip4/127.0.0.1/tcp/8337")},
|
||||||
SeedAddresses: []multiaddr.Multiaddr{},
|
SeedAddresses: []multiaddr.Multiaddr{},
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMultiAddrForced(addr string) multiaddr.Multiaddr {
|
func NewMultiAddrForced(addr string) multiaddr.Multiaddr {
|
||||||
@@ -30,64 +30,87 @@ func NewMultiAddrForced(addr string) multiaddr.Multiaddr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
|
||||||
ListenAddresses []multiaddr.Multiaddr
|
ListenAddresses []multiaddr.Multiaddr
|
||||||
SeedAddresses []multiaddr.Multiaddr
|
SeedAddresses []multiaddr.Multiaddr
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
|
context.Context
|
||||||
host host.Host
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(config Config) (srv *Server, err error) {
|
func New(config Config) (srv *Server, err error) {
|
||||||
|
|
||||||
// Start a new p2p host for the current node.
|
log.I.Ln("initializing the server.")
|
||||||
log.D.Ln("generating a new p2p host.")
|
|
||||||
|
|
||||||
log.I.Ln("p2p listeners:")
|
var s Server
|
||||||
for _, addr := range config.ListenAddresses {
|
var cancel context.CancelFunc
|
||||||
log.I.Ln("-", addr.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
var p2pHost core.Host
|
s.Context, cancel = context.WithCancel(context.Background())
|
||||||
p2pHost, err = libp2p.New(libp2p.ListenAddrs(config.ListenAddresses...))
|
|
||||||
|
|
||||||
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
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.I.Ln("p2p listeners:")
|
||||||
|
log.I.Ln("-", s.host.Addrs())
|
||||||
|
|
||||||
log.I.Ln("host id:")
|
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
|
// 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
|
// 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
|
// DHT, so that the bootstrapping node of the DHT can go down without
|
||||||
// inhibiting future peer discovery.
|
// inhibiting future peer discovery.
|
||||||
ctx := context.Background()
|
if s.dht, err = dht.New(s.Context, s.host); check(err) {
|
||||||
|
|
||||||
var kaDHT *dht.IpfsDHT
|
|
||||||
|
|
||||||
if kaDHT, err = dht.New(ctx, p2pHost); err != nil {
|
|
||||||
return nil, 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
|
return &s, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user