feat(PROJ-56): Last-Entzerrung für OCR und IMAP-Sync

OCR-Worker pausieren optional in konfigurierbarem Zeitfenster
(paused_hours), Jobs bleiben pending statt verworfen zu werden.
IMAP-Scheduler verteilt Sync-Starts via deterministischem
Pro-Account-Jitter, um Lastspitzen bei vielen Postfächern mit
gleichem Intervall zu vermeiden. Beides per Config opt-out,
Default-Verhalten unverändert. Build + Smoke-Test auf 132 verifiziert.
This commit is contained in:
sysops
2026-06-22 14:21:09 +02:00
parent a55faf74b1
commit 4dbf27cc1d
7 changed files with 261 additions and 12 deletions
+9 -3
View File
@@ -190,10 +190,15 @@ func main() {
// into the storage-dir which is guaranteed-RW.
ocr.SetTempDir(cfg.Storage.StorePath + "/ocr-tmp")
ocrWorker := ocr.NewWorker(mailStore, idxMgr, ocr.Options{
Workers: 2,
QueueSize: 1000,
Logger: logger,
Workers: 2,
QueueSize: 1000,
Logger: logger,
PausedHours: cfg.OCR.PausedHours, // PROJ-56: optional local-time pause window
})
if cfg.OCR.PausedHours != nil {
logger.Info("ocr worker: pause window configured",
"from_hour", cfg.OCR.PausedHours[0], "to_hour", cfg.OCR.PausedHours[1])
}
ocrWorker.Start(context.Background())
defer ocrWorker.Stop()
if !ocr.IsAvailable() {
@@ -433,6 +438,7 @@ func main() {
})
}
imapSched := imapstore.NewScheduler(imapSt, imapImp, logger)
imapSched.SetJitterSeconds(cfg.IMAPScheduler.ResolvedJitterSeconds()) // PROJ-56: deterministic per-account sync spread
imapSched.SetAuditLogger(audlog) // PROJ-45: tenant-visible UIDVALIDITY-reset audit entries
imapSched.Start()
defer imapSched.Stop()