blob: e53e6a956dd6297e2ddf72df5a818bbf768ab36e [file] [log] [blame]
// Copyright 2022 CeresDB Project Authors. Licensed under Apache-2.0.
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/CeresDB/ceresmeta/pkg/coderr"
"github.com/CeresDB/ceresmeta/pkg/log"
"github.com/CeresDB/ceresmeta/server"
"github.com/CeresDB/ceresmeta/server/config"
"github.com/pelletier/go-toml/v2"
"go.uber.org/zap"
)
func panicf(format string, args ...any) {
msg := fmt.Sprintf(format, args...)
panic(msg)
}
func main() {
cfgParser, err := config.MakeConfigParser()
if err != nil {
panicf("fail to generate config builder, err:%v", err)
}
cfg, err := cfgParser.Parse(os.Args[1:])
if coderr.Is(err, coderr.PrintHelpUsage) {
return
}
if err != nil {
panicf("fail to parse config from command line params, err:%v", err)
}
if err := cfg.ValidateAndAdjust(); err != nil {
panicf("invalid config, err:%v", err)
}
if err := cfgParser.ParseConfigFromToml(); err != nil {
panicf("fail to parse config from toml file, err:%v", err)
}
if err := cfgParser.ParseConfigFromEnv(); err != nil {
panicf("fail to parse config from environment variable, err:%v", err)
}
cfgByte, err := toml.Marshal(cfg)
if err != nil {
panicf("fail to marshal server config, err:%v", err)
}
logger, err := log.InitGlobalLogger(&cfg.Log)
if err != nil {
panicf("fail to init global logger, err:%v", err)
}
defer logger.Sync() //nolint:errcheck
// TODO: Do adjustment to config for preparing joining existing cluster.
log.Info("server start with config", zap.String("config", string(cfgByte)))
srv, err := server.CreateServer(cfg)
if err != nil {
log.Error("fail to create server", zap.Error(err))
return
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
sc := make(chan os.Signal, 1)
signal.Notify(sc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
var sig os.Signal
go func() {
sig = <-sc
cancel()
}()
if err := srv.Run(ctx); err != nil {
log.Error("fail to run server", zap.Error(err))
return
}
<-ctx.Done()
log.Info("got signal to exit", zap.Any("signal", sig))
srv.Close()
}