diff --git a/cmd/server/main.go b/cmd/server/main.go index 3b30709d..a498b697 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -224,8 +224,15 @@ func main() { defer stopEviction() // Auto-prune old packets if retention.packetDays is configured + var stopPrune func() if cfg.Retention != nil && cfg.Retention.PacketDays > 0 { days := cfg.Retention.PacketDays + pruneTicker := time.NewTicker(24 * time.Hour) + pruneDone := make(chan struct{}) + stopPrune = func() { + pruneTicker.Stop() + close(pruneDone) + } go func() { time.Sleep(1 * time.Minute) if n, err := database.PruneOldPackets(days); err != nil { @@ -233,11 +240,16 @@ func main() { } else { log.Printf("[prune] deleted %d transmissions older than %d days", n, days) } - for range time.Tick(24 * time.Hour) { - if n, err := database.PruneOldPackets(days); err != nil { - log.Printf("[prune] error: %v", err) - } else { - log.Printf("[prune] deleted %d transmissions older than %d days", n, days) + for { + select { + case <-pruneTicker.C: + if n, err := database.PruneOldPackets(days); err != nil { + log.Printf("[prune] error: %v", err) + } else { + log.Printf("[prune] deleted %d transmissions older than %d days", n, days) + } + case <-pruneDone: + return } } }() @@ -262,6 +274,11 @@ func main() { // 1. Stop accepting new WebSocket/poll data poller.Stop() + // 1b. Stop auto-prune ticker + if stopPrune != nil { + stopPrune() + } + // 2. Gracefully drain HTTP connections (up to 15s) ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel()