2020-07-10 14:17:51 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2021-01-12 11:05:08 +00:00
|
|
|
"context"
|
2020-09-16 07:45:08 +00:00
|
|
|
"flag"
|
2021-05-31 05:11:23 +00:00
|
|
|
"fmt"
|
2020-08-21 15:01:59 +00:00
|
|
|
"log"
|
2021-07-06 13:24:18 +00:00
|
|
|
"os"
|
2021-06-28 14:01:31 +00:00
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
2020-08-21 15:01:59 +00:00
|
|
|
|
2021-05-11 09:25:14 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/misc"
|
2021-01-15 10:28:37 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/services/control"
|
2021-01-12 11:05:08 +00:00
|
|
|
"go.uber.org/zap"
|
2020-07-10 14:17:51 +00:00
|
|
|
)
|
|
|
|
|
2021-07-06 13:24:18 +00:00
|
|
|
const (
|
|
|
|
// SuccessReturnCode returns when application closed without panic
|
|
|
|
SuccessReturnCode = 0
|
|
|
|
)
|
|
|
|
|
2021-05-31 05:11:23 +00:00
|
|
|
// prints err to standard logger and calls os.Exit(1).
|
2020-08-21 15:01:59 +00:00
|
|
|
func fatalOnErr(err error) {
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-31 05:11:23 +00:00
|
|
|
// prints err with details to standard logger and calls os.Exit(1).
|
|
|
|
func fatalOnErrDetails(details string, err error) {
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(fmt.Errorf("%s: %w", details, err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-10 14:17:51 +00:00
|
|
|
func main() {
|
2020-09-16 07:45:08 +00:00
|
|
|
configFile := flag.String("config", "", "path to config")
|
2021-12-03 03:42:35 +00:00
|
|
|
versionFlag := flag.Bool("version", false, "neofs node version")
|
2020-09-16 07:45:08 +00:00
|
|
|
flag.Parse()
|
|
|
|
|
2021-07-06 13:24:18 +00:00
|
|
|
if *versionFlag {
|
|
|
|
fmt.Printf(
|
|
|
|
"Version: %s \nBuild: %s \nDebug: %s\n",
|
|
|
|
misc.Version,
|
|
|
|
misc.Build,
|
|
|
|
misc.Debug,
|
|
|
|
)
|
|
|
|
|
|
|
|
os.Exit(SuccessReturnCode)
|
|
|
|
}
|
|
|
|
|
2020-09-16 07:45:08 +00:00
|
|
|
c := initCfg(*configFile)
|
2020-08-21 15:01:59 +00:00
|
|
|
|
2021-01-11 15:17:06 +00:00
|
|
|
initApp(c)
|
2020-08-24 09:40:32 +00:00
|
|
|
|
2021-01-15 10:28:37 +00:00
|
|
|
c.setHealthStatus(control.HealthStatus_STARTING)
|
|
|
|
|
2020-08-24 09:40:32 +00:00
|
|
|
bootUp(c)
|
|
|
|
|
2021-01-15 10:28:37 +00:00
|
|
|
c.setHealthStatus(control.HealthStatus_READY)
|
|
|
|
|
2020-08-24 09:40:32 +00:00
|
|
|
wait(c)
|
|
|
|
|
2021-01-15 10:28:37 +00:00
|
|
|
c.setHealthStatus(control.HealthStatus_SHUTTING_DOWN)
|
|
|
|
|
2020-08-24 09:40:32 +00:00
|
|
|
shutdown(c)
|
|
|
|
}
|
|
|
|
|
2021-01-11 15:17:06 +00:00
|
|
|
func initApp(c *cfg) {
|
2021-06-28 14:01:31 +00:00
|
|
|
c.ctx, c.ctxCancel = signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
|
2020-08-21 15:01:59 +00:00
|
|
|
|
2020-08-24 09:40:32 +00:00
|
|
|
initGRPC(c)
|
|
|
|
|
2020-10-08 13:17:50 +00:00
|
|
|
initNetmapService(c)
|
2020-08-24 09:40:32 +00:00
|
|
|
initAccountingService(c)
|
2020-08-24 14:07:08 +00:00
|
|
|
initContainerService(c)
|
2020-08-24 15:51:42 +00:00
|
|
|
initSessionService(c)
|
2021-03-23 18:54:00 +00:00
|
|
|
initReputationService(c)
|
2020-08-25 13:37:10 +00:00
|
|
|
initObjectService(c)
|
2020-10-02 13:18:38 +00:00
|
|
|
initProfiler(c)
|
2021-03-15 13:11:40 +00:00
|
|
|
initMetrics(c)
|
2021-01-13 13:46:39 +00:00
|
|
|
initControlService(c)
|
2020-10-21 09:26:16 +00:00
|
|
|
|
2020-11-30 15:35:37 +00:00
|
|
|
fatalOnErr(c.cfgObject.cfgLocalStorage.localStorage.Open())
|
|
|
|
fatalOnErr(c.cfgObject.cfgLocalStorage.localStorage.Init())
|
|
|
|
|
2020-10-21 09:26:16 +00:00
|
|
|
listenMorphNotifications(c)
|
2020-08-24 09:40:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func bootUp(c *cfg) {
|
2020-08-22 11:03:45 +00:00
|
|
|
serveGRPC(c)
|
2021-08-25 10:49:59 +00:00
|
|
|
makeAndWaitNotaryDeposit(c)
|
2021-09-09 11:57:55 +00:00
|
|
|
bootstrapNode(c)
|
2020-10-03 09:57:02 +00:00
|
|
|
startWorkers(c)
|
2021-04-15 14:57:29 +00:00
|
|
|
startBlockTimers(c)
|
2020-08-24 09:40:32 +00:00
|
|
|
}
|
2020-07-10 14:17:51 +00:00
|
|
|
|
2020-08-24 09:40:32 +00:00
|
|
|
func wait(c *cfg) {
|
2021-05-11 09:25:14 +00:00
|
|
|
c.log.Info("application started",
|
2021-08-25 14:24:19 +00:00
|
|
|
zap.String("build_time", misc.Build),
|
2021-05-11 09:25:14 +00:00
|
|
|
zap.String("version", misc.Version),
|
|
|
|
zap.String("debug", misc.Debug),
|
|
|
|
)
|
2020-09-25 12:34:17 +00:00
|
|
|
|
2021-01-12 11:05:08 +00:00
|
|
|
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()))
|
|
|
|
}
|
2020-08-24 09:40:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func shutdown(c *cfg) {
|
2021-01-18 08:56:14 +00:00
|
|
|
for _, closer := range c.closers {
|
|
|
|
closer()
|
|
|
|
}
|
2020-08-22 11:03:45 +00:00
|
|
|
|
2021-08-04 14:44:37 +00:00
|
|
|
c.log.Debug("waiting for all processes to stop")
|
|
|
|
|
2020-08-22 11:03:45 +00:00
|
|
|
c.wg.Wait()
|
2020-07-10 14:17:51 +00:00
|
|
|
}
|
2021-01-18 08:56:14 +00:00
|
|
|
|
|
|
|
func (c *cfg) onShutdown(f func()) {
|
|
|
|
c.closers = append(c.closers, f)
|
|
|
|
}
|