ГСЧ Валидаты: всегда живая проверка — если seed пропал (перезагрузка ВМ), мастер снова показывает датчик

Раньше готовность кэшировалась в памяти и не возвращалась в «не готов»: после
перезагрузки ВМ seed Валидаты пропадал, а bj рапортовал «готов» и прятал карточку
датчика — пересборка справочника падала без понятной причины. Теперь rngCheck
каждый раз проверяет живьём у воркера.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-20 17:34:33 +03:00
parent 93d23dae79
commit 8d71543ac3
+12 -15
View File
@@ -24,7 +24,8 @@ import (
var rngDir = "/var/lib/bj/rng" var rngDir = "/var/lib/bj/rng"
// rngReady — датчик уже инициализирован (запоминаем: обратно в «не готов» он сам не возвращается). // rngReady — последняя известная готовность датчика (кэш UI). На виртуалке готовность может
// вернуться в «не готов» (пропал seed), поэтому rngCheck всегда перепроверяет живьём.
var rngReady struct { var rngReady struct {
sync.Mutex sync.Mutex
ok bool ok bool
@@ -69,21 +70,17 @@ func rngCheck(ctx context.Context) rngView {
if rngLive(s, age) { if rngLive(s, age) {
return rngView{OK: true, State: s.State, Progress: s.Progress, Window: s.Window} return rngView{OK: true, State: s.State, Progress: s.Progress, Window: s.Window}
} }
rngReady.Lock() // Всегда живая проверка у воркера: на виртуальной машине seed Валидаты
ready := rngReady.ok // (/opt/Validata/VDCSP/.crysvc.seed) может пропасть при перезагрузке или рестарте
rngReady.Unlock() // службы ключей — тогда датчик снова «не готов», и мастер должен снова его запросить.
if !ready { res, err := runKeymediaOp(ctx, "rng-status", nil)
res, err := runKeymediaOp(ctx, "rng-status", nil) if err != nil {
if err != nil { return rngView{Error: "проверка датчика не удалась: " + errStr(err)}
return rngView{Error: "проверка датчика не удалась: " + errStr(err)}
}
ready = res["ready"] == true
if ready {
rngReady.Lock()
rngReady.ok = true
rngReady.Unlock()
}
} }
ready := res["ready"] == true
rngReady.Lock()
rngReady.ok = ready
rngReady.Unlock()
v := rngView{OK: true, Ready: ready} v := rngView{OK: true, Ready: ready}
if age < 10*time.Minute { // итог недавнего сеанса — показать, чем кончился if age < 10*time.Minute { // итог недавнего сеанса — показать, чем кончился
switch { switch {