diff --git a/internal/lkgateway/validatarng.go b/internal/lkgateway/validatarng.go index 4ff75d2..8364fe8 100644 --- a/internal/lkgateway/validatarng.go +++ b/internal/lkgateway/validatarng.go @@ -24,7 +24,8 @@ import ( var rngDir = "/var/lib/bj/rng" -// rngReady — датчик уже инициализирован (запоминаем: обратно в «не готов» он сам не возвращается). +// rngReady — последняя известная готовность датчика (кэш UI). На виртуалке готовность может +// вернуться в «не готов» (пропал seed), поэтому rngCheck всегда перепроверяет живьём. var rngReady struct { sync.Mutex ok bool @@ -69,21 +70,17 @@ func rngCheck(ctx context.Context) rngView { if rngLive(s, age) { return rngView{OK: true, State: s.State, Progress: s.Progress, Window: s.Window} } - rngReady.Lock() - ready := rngReady.ok - rngReady.Unlock() - if !ready { - res, err := runKeymediaOp(ctx, "rng-status", nil) - if err != nil { - return rngView{Error: "проверка датчика не удалась: " + errStr(err)} - } - ready = res["ready"] == true - if ready { - rngReady.Lock() - rngReady.ok = true - rngReady.Unlock() - } + // Всегда живая проверка у воркера: на виртуальной машине seed Валидаты + // (/opt/Validata/VDCSP/.crysvc.seed) может пропасть при перезагрузке или рестарте + // службы ключей — тогда датчик снова «не готов», и мастер должен снова его запросить. + res, err := runKeymediaOp(ctx, "rng-status", nil) + if err != nil { + return rngView{Error: "проверка датчика не удалась: " + errStr(err)} } + ready := res["ready"] == true + rngReady.Lock() + rngReady.ok = ready + rngReady.Unlock() v := rngView{OK: true, Ready: ready} if age < 10*time.Minute { // итог недавнего сеанса — показать, чем кончился switch {