Files
indra/pkg/seed/server.go
2023-03-01 12:42:17 +00:00

112 lines
1.5 KiB
Go

package seed
import (
"context"
"git-indra.lan/indra-labs/indra/pkg/p2p"
"git-indra.lan/indra-labs/indra/pkg/rpc"
"git-indra.lan/indra-labs/indra/pkg/storage"
"github.com/tutorialedge/go-grpc-tutorial/chat"
"google.golang.org/grpc"
"sync"
)
var (
inUse sync.Mutex
)
func Run(ctx context.Context) {
if !inUse.TryLock() {
log.E.Ln("seed is in use")
return
}
log.I.Ln("running seed")
//
// Storage
//
go storage.Run()
select {
case err := <-storage.WhenStartFailed():
log.E.Ln("storage can't start:", err)
startupErrors <- err
return
case <-storage.WhenReady():
// continue
case <-ctx.Done():
Shutdown()
return
}
//
// P2P
//
go p2p.Run()
select {
case err := <-p2p.WhenStartFailed():
log.E.Ln("p2p can't start:", err)
startupErrors <- err
return
case <-p2p.WhenReady():
// continue
case <-ctx.Done():
Shutdown()
return
}
//
// RPC
//
//
// Ready!
//
go rpc.RunWith(func(srv *grpc.Server) {
chat.RegisterChatServiceServer(srv, &chat.Server{})
})
select {
case err := <-rpc.WhenStartFailed():
log.E.Ln("rpc can't start:", err)
startupErrors <- err
return
case <-rpc.IsReady():
// continue
case <-ctx.Done():
Shutdown()
return
}
log.I.Ln("seed is ready")
isReadyChan <- true
select {
case <-ctx.Done():
Shutdown()
return
}
}
func Shutdown() {
log.I.Ln("shutting down seed")
var err error
err = p2p.Shutdown()
check(err)
err = storage.Shutdown()
check(err)
log.I.Ln("seed shutdown completed")
isShutdownChan <- true
}