frostfs-node/cmd/neofs-node/main.go
Leonard Lyubich df3746fa68 [#306] cmd/node: Switch health status on boot and shutdown
Implement HealthChecker on node app structure. Set health status to ONLINE
after node boot. Set health status to OFFLINE on shutdown.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
2021-01-14 12:13:49 +03:00

85 lines
1.4 KiB
Go

package main
import (
"context"
"flag"
"log"
"github.com/nspcc-dev/neofs-node/pkg/services/private"
"github.com/nspcc-dev/neofs-node/pkg/util/grace"
"go.uber.org/zap"
)
func fatalOnErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
configFile := flag.String("config", "", "path to config")
flag.Parse()
c := initCfg(*configFile)
initApp(c)
bootUp(c)
wait(c)
shutdown(c)
}
func initApp(c *cfg) {
c.ctx, c.ctxCancel = context.WithCancel(grace.NewGracefulContext(nil))
initGRPC(c)
initNetmapService(c)
initAccountingService(c)
initContainerService(c)
initSessionService(c)
initObjectService(c)
initProfiler(c)
initPrivateService(c)
fatalOnErr(c.cfgObject.cfgLocalStorage.localStorage.Open())
fatalOnErr(c.cfgObject.cfgLocalStorage.localStorage.Init())
listenMorphNotifications(c)
}
func bootUp(c *cfg) {
serveProfiler(c)
serveGRPC(c)
bootstrapNode(c)
startWorkers(c)
c.setHealthStatus(private.HealthStatus_ONLINE)
}
func wait(c *cfg) {
c.log.Info("application started")
select {
case <-c.ctx.Done(): // graceful shutdown
case err := <-c.internalErr: // internal application error
close(c.internalErr)
c.ctxCancel()
c.log.Warn("internal application error",
zap.String("message", err.Error()))
}
}
func shutdown(c *cfg) {
c.cfgGRPC.server.GracefulStop()
c.cfgPrivateService.server.GracefulStop()
c.log.Info("gRPC server stopped")
goOffline(c)
c.wg.Wait()
}