From 8d71543ac387efb7ed69a9ed82deb5118aa39014 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Tue, 20 Oct 2026 17:34:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=A1=D0=A7=20=D0=92=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=8B:=20=D0=B2=D1=81=D0=B5=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=B6=D0=B8=D0=B2=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=E2=80=94=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20seed=20=D0=BF=D1=80=D0=BE=D0=BF=D0=B0=D0=BB=20(=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=92=D0=9C),=20=D0=BC=D0=B0=D1=81=D1=82=D0=B5=D1=80?= =?UTF-8?q?=20=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=B4=D0=B0=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше готовность кэшировалась в памяти и не возвращалась в «не готов»: после перезагрузки ВМ seed Валидаты пропадал, а bj рапортовал «готов» и прятал карточку датчика — пересборка справочника падала без понятной причины. Теперь rngCheck каждый раз проверяет живьём у воркера. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- internal/lkgateway/validatarng.go | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) 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 {