posts/main.go

48 lines
1.1 KiB
Go

package main
import (
"log"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
s := NewStore()
// Boot: restore from latest cold snapshot, if any.
if path := os.Getenv("POSTS_COLD_PATH"); path != "" {
s.flushPath = path
}
if loaded, err := s.RestoreFromLatest(s.flushPath); err != nil {
log.Fatalf("restore failed: %v", err)
} else if loaded != "" {
log.Printf("restored from %s", loaded)
}
srv := NewServer(s)
// SIGTERM handler: cancel the flush context so the flush goroutine runs
// its final flush before exit. Per Q6 D-cadence.
go func() {
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
<-sig
log.Printf("shutdown signal received, flushing...")
ShutdownFlush()
if err := s.FlushNow(); err != nil {
log.Printf("final flush error: %v", err)
}
os.Exit(0)
}()
restAddr := os.Getenv("ADDR")
if restAddr == "" {
restAddr = ":8310"
}
log.Printf("posts listening on %s (cold=%s)", restAddr, s.flushPath)
if err := http.ListenAndServe(restAddr, srv.Routes()); err != nil {
log.Fatal(err)
}
}