volume-manager: rebuild a volume when its storage driver dies (S5)
The V4 review's open edge: a storage driver that crashes while its device stays in the tree left fat wedged on a dead channel — device-presence polling (a device-manager enumerate) still reported the device present, so nothing reaped it. pollTick now also probes channelAlive(dev), a geometry() on the block channel that fails fast on the dead endpoint; a present device with a dead channel is reaped like a pull, and the adopt loop re-adopts it on the restarted driver's fresh channel — the rebuild. The manager's own liveness probe makes fat self-detection unnecessary: it rebuilds regardless of the wedged filesystem's state. The drill: the device manager gains a test-storage-restart mode that kills usb-storage once, ~2s after its hello (post-mount); a new volume-driver-restart kernel case boots a manual tree with it, and the QEMU case asserts a SECOND mount of the same id-path after the reap — the rebuild. A pre-S5 manager, checking only device presence, never reaps, so the second mount never appears. The manually-spawned volume manager needed kernel-supervisor protocol grants (bind its name, open the device manager), as the other manual-tree services already have. Full suite 133/133.
This commit is contained in:
@@ -815,6 +815,23 @@ CASES = [
|
||||
r"[\s\S]*volume-manager: medium left a storage device; unmounting"
|
||||
r"[\s\S]*volume-manager: storage for volume \d+ removed; unmounting",
|
||||
"fail": r"DANOS-TEST-RESULT: FAIL"},
|
||||
# S5 storage-driver-crash rebuild. The device manager (test-storage-restart
|
||||
# mode) kills usb-storage once, ~2s in — after its volume mounted. The device
|
||||
# stays in the tree, so device-presence polling alone would leave fat wedged on
|
||||
# the dead channel; the volume manager's channel-liveness probe (a geometry()
|
||||
# that fails on the dead endpoint) must notice, reap the volume, and rebuild on
|
||||
# the restarted driver's fresh channel — a SECOND mount of the same id-path.
|
||||
# Discrimination: a pre-S5 manager checks only isDevicePresent (still true), so
|
||||
# it never reaps and the second mount never appears (it would restart fat on
|
||||
# the stale channel and crash-loop).
|
||||
{"name": "volume-driver-restart",
|
||||
"build_case": "volume-driver-restart",
|
||||
"smp": 4,
|
||||
"timeout": 150,
|
||||
"expect": r"(?s)fat: mounted /volumes/fat-12345678"
|
||||
r"[\s\S]*volume-manager: storage for volume \d+ removed; unmounting"
|
||||
r"[\s\S]*fat: mounted /volumes/fat-12345678",
|
||||
"fail": r"failing repeatedly; giving up|\[FAIL\]|DANOS-TEST-RESULT: FAIL"},
|
||||
# Volume-manager discovery + probe (V3a, docs/volume-manager-plan.md). Reuses
|
||||
# the fat-mount kernel build (the default boot now spawns the volume manager
|
||||
# from init.csv). It acquires the mass-storage block channel through the
|
||||
|
||||
Reference in New Issue
Block a user