R-1270 (P2): a restore whose app does not reach running in time is never a success — every restore path returns ErrRestoreNotStarted, the household reads that the data is back but the app has not started yet, one operator alarm; the data stays, the undo copy is kept, a late start turns the record into a success and releases the copy. Red-proved. Commit only.
gates / gates (push) Successful in 1m32s

This commit is contained in:
2026-10-25 09:33:26 +01:00
parent 02daebe9c5
commit b680db85cb
18 changed files with 405 additions and 23 deletions
+8
View File
@@ -1541,6 +1541,14 @@ func main() {
})
// R-893 option A (D20 = A): a failed off-site restore that was PUT BACK — the live volumes and definition poured
// back and the app started. The same operator-tier event as the hold above (no new event type), its own leg.
// R-1270: a restore whose data is back but whose app did not start in time — one operator line, its own leg.
backupMgr.SetRestoreNotStartedNotify(func(stack, kind string, cause error) {
d := notify.BackupRunFailuresDetails{RunKind: "restore", Failed: 1, Attempted: 1}
d.Apps = append(d.Apps, notify.RunFailureDetail{App: stack, Leg: "restore-not-started", Reason: cause.Error()})
msg := fmt.Sprintf("App %q: its %s put the data back, but the app did not start in time (R-1270). The household was told it has not "+
"started yet; the pre-restore copy is kept. If it does not start by itself within 30 minutes, it needs a look. Error: %v", stack, kind, cause)
notifier.NotifyBackupRunFailures(msg, d)
})
backupMgr.SetRestorePutBackNotify(func(stack string, replayErr error) {
d := notify.BackupRunFailuresDetails{RunKind: "offsite-reconstitute", Failed: 1, Attempted: 1}
d.Apps = append(d.Apps, notify.RunFailureDetail{App: stack, Leg: "restore-put-back", Reason: "restore failed; the pre-restore copy was put back"})