From d34817a36c1b1e923777073efad909ff2d7bcb43 Mon Sep 17 00:00:00 2001 From: Jason Staack Date: Thu, 12 Mar 2026 20:55:06 -0500 Subject: [PATCH] feat(02-02): wire BackupScheduler into main.go lifecycle - Create BackupScheduler with all dependencies injected - Run as goroutine parallel to status poll scheduler - Shares same context for graceful shutdown via SIGINT/SIGTERM - Startup logged with interval, max_concurrent, command_timeout Co-Authored-By: Claude Opus 4.6 --- poller/cmd/poller/main.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/poller/cmd/poller/main.go b/poller/cmd/poller/main.go index 528ac7f..82090e7 100644 --- a/poller/cmd/poller/main.go +++ b/poller/cmd/poller/main.go @@ -275,6 +275,36 @@ func main() { "conn_timeout", connTimeout, ) + // ----------------------------------------------------------------------- + // Start the config backup scheduler + // ----------------------------------------------------------------------- + backupInterval := time.Duration(cfg.ConfigBackupIntervalSeconds) * time.Second + backupCmdTimeout := time.Duration(cfg.ConfigBackupCommandTimeoutSeconds) * time.Second + + backupScheduler := poller.NewBackupScheduler( + deviceStore, + deviceStore, // SSHHostKeyUpdater (DeviceStore satisfies this interface) + locker, + publisher, + credentialCache, + redisClient, + backupInterval, + backupCmdTimeout, + refreshPeriod, // reuse existing device refresh period + cfg.ConfigBackupMaxConcurrent, + ) + + go func() { + slog.Info("starting config backup scheduler", + "interval", backupInterval, + "max_concurrent", cfg.ConfigBackupMaxConcurrent, + "command_timeout", backupCmdTimeout, + ) + if err := backupScheduler.Run(ctx); err != nil { + slog.Error("backup scheduler exited with error", "error", err) + } + }() + if err := scheduler.Run(ctx); err != nil { slog.Error("scheduler exited with error", "error", err) os.Exit(1)