Fix two preflight defects a live production rehearsal found
Ran the rehearsal read-only against a live production instance. It completed, and two preflight checks were wrong in ways a test instance could not have shown. 1. Store-backend detection missed the config entirely. A config generated by `stalwart --init` declares `type = "rocksdb"` inside a `[store.rocksdb]` section, which is what every test fixture here used. The production config has no section headers at all and declares `store.rocksdb.type = "rocksdb"` flat. Detection only matched a bare `type` key, so it reported "no known store backend type found in config" and left topology.store_backend empty. That mattered more than a warning suggests: backup.Run treated an unrecognized backend as a *skip*, so a real run would have continued with no filesystem or database backup at all - the single artifact that phase exists to produce, quietly absent. Flat dotted keys are now detected, and an unrecognized backend is a hard failure rather than a skip. 2. The cluster warning didn't say where it matched. It fires on any occurrence of "cluster" anywhere in the config, which is the correct bias - a missed cluster corrupts a shared store - but on the production config the only match was inside the value of an unrelated setting, leaving a whole config to search to establish that. It now names the location and distinguishes a match in the setting name from one in its value. Both verified against the real config: store-backend now reports "rocksdb (store.rocksdb)", and the cluster warning names the setting, making a false positive dismissible at a glance. No production data is in this commit: the fixtures use example.com and the flat-key shape only. Coverage numbers from that run matched the earlier scrubbed-corpus measurement exactly.
This commit is contained in:
@@ -184,10 +184,19 @@ func Run(ctx context.Context, store *checkpoint.Store, rs *checkpoint.RunState,
|
||||
}
|
||||
|
||||
default:
|
||||
report.Results = append(report.Results, CheckResult{
|
||||
Name: "backend-backup", Status: StatusSkipped,
|
||||
Detail: fmt.Sprintf("no known store backend recorded for this run (topology.store_backend=%q) - preflight must run first, or the backend wasn't recognized; no filesystem/DB backup was taken", rs.Topology.StoreBackend),
|
||||
})
|
||||
// Not a skip. An unrecognized backend used to be reported as
|
||||
// "skipped" and the run continued with no filesystem or database
|
||||
// backup at all - the one artifact this phase exists to produce,
|
||||
// quietly absent. It is reachable in practice: preflight failed to
|
||||
// detect the backend of a real production instance because its
|
||||
// config declares it with flat dotted keys, and the run would have
|
||||
// proceeded backup-less.
|
||||
err := fmt.Errorf("backup: no recognized store backend for this run (topology.store_backend=%q) - "+
|
||||
"refusing to continue without a filesystem or database backup. Run preflight first; if it also can't "+
|
||||
"identify the backend, the config layout isn't one this tool recognizes and the backup must be taken by hand",
|
||||
rs.Topology.StoreBackend)
|
||||
report.Results = append(report.Results, CheckResult{Name: "backend-backup", Status: StatusFail, Detail: err.Error()})
|
||||
return report, err
|
||||
}
|
||||
|
||||
if _, err := step("settings-dump", func() (checkpoint.StepOutcome, error) {
|
||||
|
||||
Reference in New Issue
Block a user