Strenger Label-Abgleich je Snapshot-Engine und Warnungen bei Altlasten #18

Closed
thorsten.spille wants to merge 0 commits from thorsten.spille/fix-3-label-match into main AGit

Behebt #3 (Bugreport: Ziel mit 50 statt 14 Snapshots). Ursache: Nach dem Wechsel von zas auf internal mit gleichem Label lag auf der Quelle noch zfs-auto-snap_zsync-miyagi-2026-07-20-1051. @.*$label trifft auch diesen Namen; als ältester Snapshot des Labels bestimmte er das Löschen auf dem Ziel, fehlte dort aber → still keine Löschung.

Änderungen

  • Neue Einstellung zfs_auto_snapshot_label_match
    • strict: das Label passt nur auf das Namensschema der Engine – internal: <label>-YYYY-MM-DD-HHMM, zas: zfs-auto-snap_<label>-YYYY-MM-DD-HHMM, hinten begrenzt (behebt auch zsync ↔ zsync-miyagi). Gilt für Erstreplikation, Deltas und Löschen. snapshot_filter-Intervalle bleiben @.*<intervall>.
    • ohne Eintrag legacy: die Muster sind exakt die bisherigen Zeichenketten, das Verhalten bleibt gleich.
    • Template und zsync.conf.example schreiben strict.
  • Warnung (beide Modi) für Snapshots, die das Label enthalten, aber nicht zum Schema passen – auf Quelle und Ziel, mit Namen.
  • Fehler + Exit-Code 1, wenn der älteste Quell-Snapshot eines Intervalls auf dem Ziel fehlt (bisher stilles Nicht-Löschen). Nur wenn das Ziel Snapshots dieses Intervalls hat.
  • README/DOCUMENTATION_DE: Regeln für Labels und kopierbare Befehle zum Aufräumen nach dem Wechsel zas → internal (lesen Quelle, Port und Label aus der Config, erst -nv).

Replikations- und Löschalgorithmus selbst unverändert; strict ändert nur, welche Namen zum Label zählen.

Tests

  • Szenarien 1–10: verändernde Aufrufe identisch zu main (Szenario 2/10 mit realistischen, datierten Label-Namen); je Dataset eine zusätzliche lokale Abfrage für die Warnung auf dem Ziel
  • 11-label-legacy-leftover (Chriz' Fall, legacy): gleiche Replikation wie bisher, jetzt [WARN] mit den Resten und [ERROR] + Exit 1 statt stillem Nicht-Löschen
  • 12-label-strict-leftover: Reste werden nicht repliziert, die alten Zielsnapshots werden gelöscht, Warnungen nennen die Reste
  • 13-label-strict-zas: strict mit zas, ein Snapshot im internal-Schema wird übersprungen
  • 14-initial-strict: Erstreplikation startet beim ältesten Snapshot im Schema, nicht beim zas-Rest; Muster kommt korrekt durch die Shell der Quelle

Closes #3

🤖 Generated with Claude Code

Behebt #3 (Bugreport: Ziel mit 50 statt 14 Snapshots). Ursache: Nach dem Wechsel von `zas` auf `internal` mit gleichem Label lag auf der Quelle noch `zfs-auto-snap_zsync-miyagi-2026-07-20-1051`. `@.*$label` trifft auch diesen Namen; als ältester Snapshot des Labels bestimmte er das Löschen auf dem Ziel, fehlte dort aber → still keine Löschung. ## Änderungen - **Neue Einstellung `zfs_auto_snapshot_label_match`** - `strict`: das Label passt nur auf das Namensschema der Engine – `internal`: `<label>-YYYY-MM-DD-HHMM`, `zas`: `zfs-auto-snap_<label>-YYYY-MM-DD-HHMM`, hinten begrenzt (behebt auch `zsync` ↔ `zsync-miyagi`). Gilt für Erstreplikation, Deltas und Löschen. `snapshot_filter`-Intervalle bleiben `@.*<intervall>`. - ohne Eintrag `legacy`: die Muster sind exakt die bisherigen Zeichenketten, das Verhalten bleibt gleich. - Template und `zsync.conf.example` schreiben `strict`. - **Warnung** (beide Modi) für Snapshots, die das Label enthalten, aber nicht zum Schema passen – auf Quelle und Ziel, mit Namen. - **Fehler + Exit-Code 1**, wenn der älteste Quell-Snapshot eines Intervalls auf dem Ziel fehlt (bisher stilles Nicht-Löschen). Nur wenn das Ziel Snapshots dieses Intervalls hat. - **README/DOCUMENTATION_DE:** Regeln für Labels und kopierbare Befehle zum Aufräumen nach dem Wechsel zas → internal (lesen Quelle, Port und Label aus der Config, erst `-nv`). Replikations- und Löschalgorithmus selbst unverändert; strict ändert nur, welche Namen zum Label zählen. ## Tests - Szenarien 1–10: verändernde Aufrufe identisch zu `main` (Szenario 2/10 mit realistischen, datierten Label-Namen); je Dataset eine zusätzliche lokale Abfrage für die Warnung auf dem Ziel - `11-label-legacy-leftover` (Chriz' Fall, legacy): gleiche Replikation wie bisher, jetzt `[WARN]` mit den Resten und `[ERROR]` + Exit 1 statt stillem Nicht-Löschen - `12-label-strict-leftover`: Reste werden nicht repliziert, die alten Zielsnapshots werden gelöscht, Warnungen nennen die Reste - `13-label-strict-zas`: strict mit zas, ein Snapshot im internal-Schema wird übersprungen - `14-initial-strict`: Erstreplikation startet beim ältesten Snapshot im Schema, nicht beim zas-Rest; Muster kommt korrekt durch die Shell der Quelle Closes #3 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Match the snapshot label strictly by engine and warn about leftovers
All checks were successful
/ build (pull_request) Successful in 24s
/ test (debian-13) (pull_request) Successful in 40s
/ test (ubuntu-24.04) (pull_request) Successful in 43s
/ test (ubuntu-26.04) (pull_request) Successful in 48s
/ test (debian-12) (pull_request) Successful in 49s
/ publish (pull_request) Has been skipped
/ package (pull_request) Successful in 0s
8c9e71b54f
A zas snapshot left over on the source after switching to the internal engine
with the same label (zfs-auto-snap_<label>-...) matched "@.*<label>". As the
oldest snapshot of the label it decided which target snapshots are deleted;
it did not exist on the target, so nothing was deleted and the target filled up.

- new setting zfs_auto_snapshot_label_match: "strict" only matches the name
  scheme of the engine (<label>-YYYY-MM-DD-HHMM or zfs-auto-snap_<label>-...),
  for replication and deletion; snapshot_filter intervals keep "@.*<interval>".
  Without the setting "legacy" keeps the previous patterns unchanged; the
  template and the example config use "strict"
- warning for snapshots that contain the label but do not match the scheme,
  on the source and on the target, with the snapshot names
- error and exit code 1 if the oldest source snapshot of an interval is
  missing on the target (previously nothing was deleted silently)
- README/DOCUMENTATION_DE: label rules and commands to clean up after
  switching from zas to internal, read from the configuration

Tests: scenarios for legacy and strict with leftovers, strict with zas and an
initial replication in strict mode; scenarios 2 and 10 use dated label names.

Refs #3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Manuell nach main gemergt (7312644), CI inkl. publish nach testing grün. Schließe den PR.

Manuell nach `main` gemergt (7312644), CI inkl. publish nach testing grün. Schließe den PR.
thorsten.spille closed this pull request 2026-10-15 18:37:46 +02:00
All checks were successful
/ build (pull_request) Successful in 24s
/ test (debian-13) (pull_request) Successful in 40s
/ test (ubuntu-24.04) (pull_request) Successful in 43s
/ test (ubuntu-26.04) (pull_request) Successful in 48s
/ test (debian-12) (pull_request) Successful in 49s
/ publish (pull_request) Has been skipped
/ package (pull_request) Successful in 0s

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
bug
enhancement
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
bashclub/zsync!18
No description provided.