Protect writer stop jobs from competing healthcheck requests

This commit is contained in:
admin committed 2026-09-15 23:00:35 +02:00
1 parent 3d16f33f24
commit 3730ab4676
5 files changed
+177 -2

No files matched your search

+21
View File
@@ -96,6 +96,7 @@ Details und geprüfte Grenzen stehen in der Update-Anleitung.
- Fehler bei Dump, rsync, Kompression und Rückleseprüfung brechen den Lauf ab.
- Wartungsmodus und Dienststopps umfassen Datenbankdump **und** Dateikopie. Danach endet die Ausfallzeit; Kompression und Upload laufen aus dem Staging.
- Vorübergehende systemd-Startsperren verhindern die erneute Aktivierung konfigurierter Writer während der Kopie. Zustands- und Zeitstempelprüfungen brechen bei erkannten Neustarts vor Veröffentlichung ab. Eigene Sperren werden beim Wiederanlauf entfernt; bestehende Maskierungen bleiben erhalten.
- Laufende Stop-Aufträge sind zusätzlich gegen Verdrängung durch fremde Reload-/Start-Aufträge geschützt. Damit kann ein Healthcheck den geplanten Dienststopp nicht abbrechen; echte Stopfehler brechen das Backup weiterhin ab.
- Upload und Rückleseprüfung melden ihre Phase und standardmäßig jede Minute rclone-Statistiken im Journal (`RCLONE_STATS_INTERVAL`). Ein laufender Auftrag ist erst nach erfolgreicher Remote-Prüfung abgenommen.
- Vollständige Sicherungssätze mit SHA-256-Manifest, Archivprüfung und zuletzt hochgeladenem `COMPLETE`-Marker.
- Retention löscht nur vollständige neue Sicherungssätze und behält mindestens `RETENTION_KEEP_LAST` Läufe. Historische v1-Sicherungen bleiben erhalten; bei Platzdruck gilt zusätzlich die abgesicherte lokale Bereinigung aus [SPEICHER.md](SPEICHER.md).
@@ -299,3 +300,23 @@ docker run --rm --network none -v "$PWD:/src:ro" app-backup-test
```
ShellCheck, echte MariaDB-Dumps/Imports, gzip/zstd, rsync, lokale Crypt-Uploads und Remote-Restore sowie Fehlerfälle laufen im Container. systemd, Nextcloud-occ und der Mailversand sind simuliert; Nachrichten werden nur lokal erfasst. Am 12.09.2026 bestand der Standardlauf mit 81 Fällen (80 erfolgreich, ein separater Docker-Test planmäßig übersprungen). Zusätzlich bestanden alle 19 gezielten Restore-Tests einschließlich echter DB-Imports und Abbruchbereinigung sowie der Installer-Test mit aktiviertem Restore-Timer. ShellCheck, Shell-Syntax und systemd-Unit-Prüfung bestanden. Eine echte Rocky-/Nextcloud-/Gitea-/OneDrive-Wiederherstellungsprobe und die tatsächliche Mailzustellung bleiben Teil der Serverabnahme.
Der Konflikt zwischen Stop und fremdem Reload/Start lässt sich separat gegen einen
echten lokalen Benutzer-systemd prüfen (ohne sudo). Der Test erzeugt nur drei
eindeutig benannte, kurzlebige Testdienste und räumt sie wieder auf:
```bash
APP_BACKUP_TEST_USER_SYSTEMD=1 python3 -m unittest discover -s tests -p test_systemd_stop.py -v
```
Er reproduziert zunächst den abgebrochenen ungeschützten Stop trotz Startbedingung
und prüft danach den produktiven Stop-Code gegen konkurrierende Reloads und Starts.
Ohne diese ausdrückliche Aktivierung werden die drei Fälle übersprungen.
Verifikation der Stop-Korrektur am 15.09.2026: Der Container-Standardlauf bestand
mit 119 Fällen (111 erfolgreich, fünf separate Docker-Integrationstests und die
drei Benutzer-systemd-Tests planmäßig übersprungen; 906,3 Sekunden). Die drei
Benutzer-systemd-Tests bestanden separat, einschließlich der Prüfung, dass der
geschützte Stop den Dienst tatsächlich inaktiv hinterlässt. ShellCheck und
Shell-Syntaxprüfung bestanden ebenfalls. Die Abnahme dieser Korrektur auf Gemini
steht noch aus.