Traefik v3.7.17 (GHSA-xv5x-242w-7hf7); R-1347 a restore forgets the update-held flag; R-1348 a failed put-back at start-up mails; R-1339, R-1351, R-1323 truthful start-up lines and one lock over FileBrowser's compose. Commit only.
gates / gates (push) Successful in 29s

This commit is contained in:
admin committed 2026-11-02 23:14:16 +01:00
1 parent a90b62323f
commit c4b6844d34
19 files changed
+569 -9

No files matched your search

@@ -126,9 +126,42 @@ func (g *AppStopGuard) holdPutBackFailed(stack, dir string, cause error) bool {
return false
}
g.logger.Printf("[ERROR] [appstop] %s: the interrupted restore could NOT be put back (%v) — the app is HELD for support, the copy stays at %s (R-1251 H2)", stack, cause, dir)
g.notifyHeld(stack)
return true
}
// SetHeldNotify wires the operator mail for a failed put-back (R-1348; main.go: the R-1340 sentence from the hold record)
// and hands over what Recover held before the notifier existed. Each held app is mailed once. Pinned by TestR1348_* and
// TestR1348_HeldNotifyIsWiredAtStartup.
func (g *AppStopGuard) SetHeldNotify(fn func(stack string)) {
if g == nil {
return
}
g.liveMu.Lock()
g.heldNotify = fn
waiting := g.heldPending
g.heldPending = nil
g.liveMu.Unlock()
if fn == nil {
return
}
for _, stack := range waiting {
fn(stack)
}
}
func (g *AppStopGuard) notifyHeld(stack string) {
g.liveMu.Lock()
fn := g.heldNotify
if fn == nil {
g.heldPending = append(g.heldPending, stack)
}
g.liveMu.Unlock()
if fn != nil {
fn(stack)
}
}
// clearPutBackPending lifts this app's waiting-put-back hold, and only that kind.
func (g *AppStopGuard) clearPutBackPending(stack string) {
if g.holds == nil {