fix(v0.3): E2E power-safe — пере-bind machine-id + reset-failed (start-limit)
Полный чистый `just vm-reset && just e2e` (PRE→reboot→POST) впервые прогнан после добавления power-safe-блока — вскрыл два латентных шва харнесса (FSM/сервис-код цел): 1. start-limit-hit: блок намеренно рестартит shturman-power N+ раз за <10s → systemd StartLimitBurst (5/10s) → power в failed, имя ru.shturman.Power теряется, блок abort не доезжает. Фикс: reset-failed перед намеренными рестартами (как при реальном reboot); ждать active power, не только settings. 2. machine-id залипал на нижнем rootfs-значении: цикл/power-cut делает `umount /etc/machine-id`, но `systemctl start shturman.target` НЕ пере-bind-ит — shturman-machineid это oneshot RemainAfterExit (уже active) → ExecStart не перезапускается. POST-чек стабильности machine-id (§9.3.4) падал после reboot. Фикс: `systemctl restart shturman-machineid` после remount (форсит пере-bind). E2E OK ✅ с нуля (vm-reset → PRE → reboot → POST); регресс v0.1/v0.2 цел. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Alexander <akotenev2003@gmail.com>
This commit is contained in:
+13
-3
@@ -199,6 +199,9 @@ echo " $(systemd-analyze time 2>/dev/null | head -1 || echo 'systemd-analyze н
|
|||||||
# ---- power-safe (v0.3): FSM ShutdownImminent + N циклов зажигания + abort + power-cut ----
|
# ---- power-safe (v0.3): FSM ShutdownImminent + N циклов зажигания + abort + power-cut ----
|
||||||
info "power-safe: ShutdownImminent + N=3 цикла зажигания + abort + power-cut"
|
info "power-safe: ShutdownImminent + N=3 цикла зажигания + abort + power-cut"
|
||||||
# Чистый FSM Running для циклов (свежий бинарь + сброс любого «залипшего» состояния от §5 fake-ACC).
|
# Чистый FSM Running для циклов (свежий бинарь + сброс любого «залипшего» состояния от §5 fake-ACC).
|
||||||
|
# reset-failed: блок ниже намеренно рестартит power N+ раз — сбрасываем счётчик StartLimitBurst (дефолт 5/10s),
|
||||||
|
# иначе systemd ловит start-limit-hit и power падает в failed (имя ru.shturman.Power на шине теряется).
|
||||||
|
sudo systemctl reset-failed shturman-power.service shturman-settings.service 2>/dev/null || true
|
||||||
sudo systemctl restart shturman-power.service
|
sudo systemctl restart shturman-power.service
|
||||||
for _ in $(seq 1 10); do systemctl is-active --quiet shturman-power && break; sleep 1; done
|
for _ in $(seq 1 10); do systemctl is-active --quiet shturman-power && break; sleep 1; done
|
||||||
sleep 1 # дать power re-acquire ru.shturman.Power на шине
|
sleep 1 # дать power re-acquire ru.shturman.Power на шине
|
||||||
@@ -223,8 +226,13 @@ for i in 1 2 3; do
|
|||||||
sudo umount /etc/machine-id 2>/dev/null || true # снять machineid-bind, иначе /data busy
|
sudo umount /etc/machine-id 2>/dev/null || true # снять machineid-bind, иначе /data busy
|
||||||
sync; sudo umount /data || fail "цикл $i: umount /data (PONR)"
|
sync; sudo umount /data || fail "цикл $i: umount /data (PONR)"
|
||||||
findmnt /data >/dev/null && fail "цикл $i: /data не размонтирован (PONR не достигнут)"
|
findmnt /data >/dev/null && fail "цикл $i: /data не размонтирован (PONR не достигнут)"
|
||||||
sudo systemctl start shturman.target # re-mount data.mount + сервисы (machineid re-bind)
|
sudo systemctl reset-failed shturman-power.service shturman-settings.service 2>/dev/null || true
|
||||||
for _ in $(seq 1 15); do systemctl is-active --quiet shturman-settings && break; sleep 1; done
|
sudo systemctl start shturman.target # re-mount data.mount + сервисы
|
||||||
|
# machineid — oneshot RemainAfterExit (уже active): plain start его НЕ перезапускает, bind не вернётся.
|
||||||
|
# restart форсит ExecStart → пере-bind /data/state/machine-id поверх снятого выше. Без этого /etc/machine-id
|
||||||
|
# залипает на нижнем rootfs-значении, и POST-чек стабильности machine-id (§9.3.4) падает после reboot.
|
||||||
|
sudo systemctl restart shturman-machineid.service
|
||||||
|
for _ in $(seq 1 15); do systemctl is-active --quiet shturman-settings && systemctl is-active --quiet shturman-power && break; sleep 1; done
|
||||||
findmnt /data >/dev/null || fail "цикл $i: /data не вернулся после remount"
|
findmnt /data >/dev/null || fail "цикл $i: /data не вернулся после remount"
|
||||||
echo "$n" | sudo tee /data/state/power-cycles >/dev/null
|
echo "$n" | sudo tee /data/state/power-cycles >/dev/null
|
||||||
pass "цикл зажигания $i: stop→umount(PONR)→remount→restart, /data вернулся"
|
pass "цикл зажигания $i: stop→umount(PONR)→remount→restart, /data вернулся"
|
||||||
@@ -254,8 +262,10 @@ sudo umount /etc/machine-id 2>/dev/null || true
|
|||||||
sudo umount /data 2>/dev/null || sudo umount -l /data 2>/dev/null || true
|
sudo umount /data 2>/dev/null || sudo umount -l /data 2>/dev/null || true
|
||||||
findmnt /data >/dev/null && fail "power-cut: /data не размонтирован (fsck был бы на смонтированном)"
|
findmnt /data >/dev/null && fail "power-cut: /data не размонтирован (fsck был бы на смонтированном)"
|
||||||
sudo fsck.ext4 -n /var/lib/shturman/data.img >/dev/null 2>&1 || fail "fsck /data не clean после power-cut"
|
sudo fsck.ext4 -n /var/lib/shturman/data.img >/dev/null 2>&1 || fail "fsck /data не clean после power-cut"
|
||||||
|
sudo systemctl reset-failed shturman-power.service shturman-settings.service 2>/dev/null || true
|
||||||
sudo systemctl start shturman.target # re-mount + restart
|
sudo systemctl start shturman.target # re-mount + restart
|
||||||
for _ in $(seq 1 15); do systemctl is-active --quiet shturman-settings && break; sleep 1; done
|
sudo systemctl restart shturman-machineid.service # пере-bind machine-id (plain start не перезапускает oneshot — см. цикл)
|
||||||
|
for _ in $(seq 1 15); do systemctl is-active --quiet shturman-settings && systemctl is-active --quiet shturman-power && break; sleep 1; done
|
||||||
sudo grep -q night /data/settings/settings.json || fail "last durable value потерян после power-cut"
|
sudo grep -q night /data/settings/settings.json || fail "last durable value потерян после power-cut"
|
||||||
pass "power-cut-сим: /data консистентен (fsck clean, night present)"
|
pass "power-cut-сим: /data консистентен (fsck clean, night present)"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user