cmd/server/main.go (88 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package main
import (
"context"
"flag"
"os"
"os/signal"
"syscall"
"github.com/apache/kvrocks-controller/config"
"github.com/apache/kvrocks-controller/logger"
"github.com/apache/kvrocks-controller/server"
"github.com/apache/kvrocks-controller/version"
"go.uber.org/zap"
"gopkg.in/yaml.v1"
)
var configPath string
func init() {
flag.StringVar(&configPath, "c", "config/config.yaml", "set config yaml file path")
}
func registerSignal(closeFn func()) {
c := make(chan os.Signal, 1)
signal.Notify(c, []os.Signal{syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR1}...)
go func() {
for sig := range c {
if handleSignals(sig) {
closeFn()
return
}
}
}()
}
func handleSignals(sig os.Signal) (exitNow bool) {
switch sig {
case syscall.SIGINT, syscall.SIGTERM:
logger.Get().With(zap.String("signal", sig.String())).Info("Got signal to exit")
return true
default:
return false
}
}
func main() {
defer logger.Sync()
ctx, cancelFn := context.WithCancel(context.Background())
// os signal handler
shutdownCh := make(chan struct{})
registerSignal(func() {
close(shutdownCh)
cancelFn()
})
flag.Parse()
logger.Get().Info("Kvrocks controller is running with version: " + version.Version)
cfg := config.Default()
if len(configPath) != 0 {
content, err := os.ReadFile(configPath)
if err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to read the config file")
return
}
if err := yaml.Unmarshal(content, cfg); err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to unmarshal the config file")
return
}
}
if err := cfg.Validate(); err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to validate the config file")
return
}
if cfg.Log != nil && cfg.Log.Filename != "" {
logger.Get().Info("Logs will be saved to " + cfg.Log.Filename)
if err := logger.InitLoggerRotate(cfg.Log.Level, cfg.Log.Filename, cfg.Log.MaxBackups, cfg.Log.MaxAge, cfg.Log.MaxSize, cfg.Log.Compress); err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to init the log rotate")
return
}
}
srv, err := server.NewServer(cfg)
if err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to create the server")
return
}
if err := srv.Start(ctx); err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to start the server")
return
}
// wait for the term signal
<-shutdownCh
if err := srv.Stop(); err != nil {
logger.Get().With(zap.Error(err)).Error("Failed to close the server")
} else {
logger.Get().Info("Bye bye, Kvrocks controller was exited")
}
}