func main() { flag.Usage = usage flag.Parse() log.Println("start blobserver service …") if *version { fmt.Fprintln(os.Stdout, Version) return } if *help { flag.Usage() os.Exit(1) } conf, err := config.ReadFile(*configFilename) if err != nil { log.Fatal(err) } if conf.Listen == "" && *laddr == "" { log.Fatal("Listen address required") } else if conf.Listen == "" { conf.Listen = *laddr } runtime.GOMAXPROCS(runtime.NumCPU()) if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } storage, err := blobserver.CreateStorage(conf) if err != nil { log.Fatalf("error instantiating storage for type %s: %v", conf.StorageType(), err) } log.Printf("Using `%s` storage", conf.StorageType()) err = server.ListenAndServe(*laddr, storage) if err != nil { log.Errorln(err) } monitoring.MeasuringPointsPrintAll() }
func TrapCloser(cl io.Closer, cleanups ...Cleanup) { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGHUP) go func() { for { rawSig := <-c sig, ok := rawSig.(syscall.Signal) if !ok { log.Fatal("not a unix signal") } switch { case sig == syscall.SIGHUP: log.Print("SIGHUP: restart process") err := RestartProcess() if err != nil { log.Fatal("failed to restart: " + err.Error()) } case sig == syscall.SIGINT || sig == syscall.SIGKILL || sig == syscall.SIGTERM: log.Print("shutting down") donec := make(chan bool) go func() { for _, cb := range cleanups { if err := cb(); err != nil { log.Error(err) } } if err := cl.Close(); err != nil { log.Fatalf("Error shutting down: %v", err) } donec <- true }() select { case <-donec: log.Printf("shutdown") os.Exit(0) case <-time.After(5 * time.Second): log.Fatal("Timeout shutting down. Exiting uncleanly.") } default: log.Fatal("Received another signal, should not happen.") } } }() }
func main() { flag.Parse() if *help { flag.Usage() os.Exit(1) } runtime.GOMAXPROCS(runtime.NumCPU()) if _, err := toml.DecodeFile(*configFilename, &config); err != nil { log.Fatal(err) } if config.Laddr == "" { config.Laddr = *laddr } for k, v := range config.Regions { v.Codename = k store, err := kvstore.Open(v.RedisDSN) if err != nil { log.Fatal(err) } conn := store.Get() _, err = conn.Do("Ping") conn.Close() if err != nil { log.Fatalf("region %s: %v", k, err) } v.Backend = NewRedisBackend(store, v.Codename) } runServer() }