ГСЧ Валидаты: всегда живая проверка — если 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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user