v0.243.0: FileBrowser generated admin password (R-513); per-tier whole-guest backup truth (R-517); skip absent-storage tiers (R-518); OOM-killed worker visible (R-514)
gates / gates (push) Successful in 14s
gates / gates (push) Successful in 14s
MinAgent: 0.131.0 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -40,6 +40,8 @@ type Notifier struct {
|
||||
mu sync.Mutex
|
||||
prevHealthStatus string // tracks previous health check status for change detection
|
||||
|
||||
// oomSeen (R-514) remembers container runs already reported as OOM-killed.
|
||||
oomSeen map[string]bool
|
||||
// appDown tracks which deployed apps are currently in the DOWN state so app_start_failed fires
|
||||
// ONCE per running→down transition, not every health cycle (fix-3 anti-spam). In-memory: a
|
||||
// controller restart re-notifies once (acceptable — better than missing). The hub owns the real
|
||||
@@ -581,6 +583,27 @@ func (n *Notifier) NotifyAppStartFailures(apps []AppRunState) {
|
||||
}
|
||||
}
|
||||
|
||||
// NotifyAppOOM — R-514 (v0.243.0). A process inside a running app container was killed by the memory
|
||||
// limit (Docker State.OOMKilled). Fires ONCE per container run (keyed by StartedAt), so a container
|
||||
// that stays OOM-marked does not repeat. "warning" — the hub vocabulary (R-329). Operator-only
|
||||
// hub-side (hub >= v0.114.0 registers it): the household sees the dashboard tag.
|
||||
func (n *Notifier) NotifyAppOOM(stack, container, startedAt string) {
|
||||
key := container + "|" + startedAt
|
||||
n.mu.Lock()
|
||||
if n.oomSeen == nil {
|
||||
n.oomSeen = map[string]bool{}
|
||||
}
|
||||
if n.oomSeen[key] {
|
||||
n.mu.Unlock()
|
||||
return
|
||||
}
|
||||
n.oomSeen[key] = true
|
||||
n.mu.Unlock()
|
||||
n.emit("app_oom", "warning",
|
||||
fmt.Sprintf("Alkalmazás memóriája elfogyott: %s (%s) — egy folyamatát a memóriakorlát leállította", stack, container),
|
||||
AppDetails{StackName: stack, DisplayName: container})
|
||||
}
|
||||
|
||||
// DiskHealthDetails is the event-detail payload for disk_health_degraded.
|
||||
type DiskHealthDetails struct {
|
||||
Disk string `json:"disk"`
|
||||
@@ -981,6 +1004,13 @@ func (n *Notifier) NotifyWholeGuestBackupFailed(tier, message, errMsg string) {
|
||||
WholeGuestBackupDetails{Tier: tier, Error: errMsg})
|
||||
}
|
||||
|
||||
// NotifyBackupTierSkipped — R-518 (v0.243.0). A whole-guest tier was not attempted because its
|
||||
// storage does not exist on the host. Operator-only hub-side (hub >= v0.114.0 registers the type in
|
||||
// allowedEventTypes AND operatorOnlyEvents): the household can do nothing about an unprovisioned DR tier.
|
||||
func (n *Notifier) NotifyBackupTierSkipped(tier, message string) {
|
||||
n.PushEvent("backup_tier_skipped", "warning", message, WholeGuestBackupDetails{Tier: tier})
|
||||
}
|
||||
|
||||
func (n *Notifier) NotifyWholeGuestBackupRecovered(tier, message string) {
|
||||
n.PushEvent("whole_guest_backup_recovered", "info", message,
|
||||
WholeGuestBackupDetails{Tier: tier})
|
||||
|
||||
Reference in New Issue
Block a user