Пісочниця оновлення: перевірка перевіряла одну пробу з вісімнадцяти
Some checks failed
CI / hygiene (push) Successful in 8s
CI / web (push) Successful in 1m2s
CI / server (push) Successful in 1m13s
CI / dbtest (push) Successful in 58s
CI / agent (push) Has been cancelled

Перший прогін на стенді пройшов, але таблиця «дані до й після» мала
ОДИН рядок замість вісімнадцяти — і виглядала повною.

docker exec читає stdin, а stdin у циклі проб — той самий їх перелік.
Перша проба з'їдала решту, цикл завершувався після одного оберту, і
нічим цього не виказував: рядок є, «ok» є.

Одне </dev/null. Тепер видно, що міграція пройшла по базі з 6936
відліками телеметрії, 24 конфігами й 12 алертами, а не по порожній.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
byrsapty 2026-08-29 00:27:10 +03:00
parent d73f693cd7
commit 3d5d1c6967
2 changed files with 43 additions and 1 deletions

View file

@ -8021,3 +8021,38 @@ ROADMAP називав три причини, з яких ламається с
міркуванням, а не запуском. Саме той стан, проти якого написана
пісочниця; перший прогін на стенді має бути перед першим тегом, а не
після.
### Прогін пісочниці оновлення на стенді (2026-08-29)
Перший наскрізний прогін `./netpulse sandbox upgrade`. Пройшов повністю:
`ec4b2cd → d73f693`, міграція 0073 накотилась поверх наповненої бази,
самоперевірка зелена, сліди прибрані.
**Дорогою знайшлась вада в самій перевірці, і саме того класу, від якого
вся ця робота й починалась.** Перший прогін звітував таблицю «дані до й
після» з ОДНОГО рядка — «хости 24 → 24, ok». Виглядало як повна
перевірка. Насправді проб вісімнадцять, а виконувалась одна:
`docker exec` читає stdin, а stdin у цьому циклі — той самий перелік
проб. Перша ж проба з'їдала решту, цикл завершувався після одного оберту,
і жодного натяку на це не було: рядок є, «ok» є.
Виправлено одним `</dev/null`. Після нього таблиця показує те, заради
чого існує:
```
проби icmp 6936 → 6936 exact
відліки метрик 6936 → 6936 exact
конфіги ncm 24 → 24 exact
алерти 12 → 12 exact
```
Тобто міграція пройшла по базі з майже сімома тисячами рядів телеметрії,
двома десятками конфігів і живими алертами — а не по порожній.
**Що прогін НЕ доводить:** «попередня версія» тут — сусідній коміт із
різницею в одну міграцію. Перед справжнім випуском треба брати `--from`
із тією версією, з якої клієнти оновлюватимуться насправді. Гілка
мігратора «наявна інсталяція» цим режимом не досяжна за побудовою: база
пісочниці народжується чистою. І `журнал аудиту 0 → 0` — проба з
правилом `min`, тобто нуль у ній нічого не доводить; чому після повної
установки аудит порожній, варто подивитись окремо.

View file

@ -2933,7 +2933,14 @@ sandbox_up_snapshot() {
sandbox_up_probes > "$_out.q"
while IFS='|' read -r _label _rule _sql; do
[ -n "$_label" ] || continue
_n=$(dc exec -T db psql -tAX -U netpulse -d netpulse -c "$_sql" 2>/dev/null | tr -d ' \r')
# </dev/null — не косметика, а причина, з якої ця перевірка
# звітувала ОДИН рядок замість вісімнадцяти. `docker exec` читає
# stdin, а stdin тут — той самий перелік проб, яким живиться
# цикл: перша ж проба з'їдала решту, цикл завершувався після
# одного оберту, і таблиця «дані до й після» виглядала повною,
# бо в ній був рядок і слово «ok». Найгірший вид зеленого:
# перевірка, яка нічого не перевірила й нічим цього не виказала.
_n=$(dc exec -T db psql -tAX -U netpulse -d netpulse -c "$_sql" </dev/null 2>/dev/null | tr -d ' \r')
case "$_n" in
''|*[!0-9]*) _n=- ;;
esac