Известные кейсы (Svacer)

 

Перед любыми изменениями в БД и object store делайте бэкап PostgreSQL и директории object store.

Перед обновлением Svacer — тоже бэкап. Большинство проблем с разметкой после апгрейда решаются бэкапом и пересчётом инвариантов.


1. Запуск и конфигурация сервера

Проблема

Решение

Сервер не запускается, в логе pebble: not found, Cannot get lines info for ... pebble: not found

Проверить --store. Если object store повреждён — восстановить _pebble_ из бэкапа. Можно скопировать _pebble_ в отдельную директорию и указать её в --store. Попробовать запустить с --classic-inv-mode. Без бэкапа исходники в object store, скорее всего, утеряны, но разметка в PostgreSQL остаётся.

on-disk corruption: ... crc32c checksum mismatch

Восстановить object store из бэкапа. Настроить регулярный rsync object store.

no space left on device, сервер падает, не запускается

Освободить место. Остановить сервер. Восстановиться из бэкапа до инцидента. Настроить мониторинг. Временно: --classic-inv-mode, SVACER_NO_INVARIANT_MIGRATION=true.

Ссылки в ответах API и в UI без домена

Запускать сервер с --public-url https://<домен>.

restart: always в docker-compose даёт циклические рестарты

Убрать restart: always или заменить на on-failure.

После перезагрузки пропали проекты

Проверить, что volume’ы не чистились. Проверить параметры запуска (путь к object store, строка БД). Собрать лог сервера.

2. Object store и PostgreSQL

Проблема

Решение

Что хранится в object store, а что в БД

Object store — исходный код и данные для навигации. PostgreSQL — разметка, комментарии, предупреждения. При потере object store код не отображается, но разметка может сохраниться.

Раздулась comment_history, БД растёт, импорт и клонирование идут медленно  

Проверить размер: select count(*) from comment_history;. Очистить: truncate comment_history; (удалится только история редактирования, сами комментарии и разметка останутся). Обновить Svacer.

Битые ссылки в marker_occurrences

Проверить: select mo.snapshot_id, invariant, ss.name, ss.import_time, br.name, pr.name, gr.status, cmnt.comment from marker_occurrences mo left join snapshots ss on ss.id = mo.snapshot_id left join containers br on br.id = ss.container left join containers pr on br.parent = pr.id left join group_review gr on gr.group_ref = mo.invariant and gr.container = br.id and gr.is_active = true left join comments cmnt on cmnt.ref = mo.id left join markers mrk on mo.marker_id = mrk.id where mrk.id is null;. Удалить битые: DELETE FROM marker_occurrences WHERE NOT EXISTS (SELECT 1 FROM markers WHERE markers.id = marker_occurrences.marker_id);. Аналогично для marker_occurrences_filtered и marker_occurrences_suppressed. Перед этим — бэкап.  

Невалидное состояние БД, отсутствуют таблицы

Руками таблицы не создавать. Поднять пустую БД, запустить на ней Svacer — он сам создаст схему при старте. Отдельных скриптов миграции нет.  

PostgreSQL: invalid page, zeroing out page  

Восстанавливаться из дампа. Проверить диск. Крайняя мера — включить zero_damaged_pages = on в postgresql.conf, перезапустить PostgreSQL, затем удалить битые ссылки (см. выше).  

Нужно освободить место в object store  

Удалить старые проекты/снимки: svacer server cleanup list / svacer server cleanup add --keep-time <N>h (при --keep-time 0h правило обрабатывается как дефолтное и сохраняет 30 дней — используйте 1h и проверяйте результат через svacer server cleanup list). Компактифицировать без удаления:  svacer-server run --compact-object-store . Удалить старый object store от версий < 9-0-0 (файлы вне _pebble_, давно не менялись). Перед всем — бэкап.  

Нужно почистить БД

VACUUM FULL (тяжёлая операция, блокирует таблицы). Очистить search_history, search_results (TRUNCATE ... CASCADE). Очистить comment_history (см. выше). ​

3. Импорт снимков и результатов

Проблема

Решение

svacer import --upload падает по timeout или EOF

Увеличить таймауты: SVACER_TIMEOUT_IMPORT_RESULTS_PREPARE=30h, 
SVACER_TIMEOUT_IMPORT_RESULTS=30h, SVACER_TIMEOUT_ADD_IMPORT_RECORD=30h.
 Увеличить таймауты прокси. Обновить до 12-0-1.

XML syntax error ... illegal character code U+0001

Удалить недопустимые символы из svres. Обновить Svace/Svacer.

failed to relate invariants

Обновиться до 12.0.0.

Ошибка при импорте снапшота из файла

Проверить целостность .snap через zstd. Импортировать на чистом экземпляре. Собрать лог.

Импорт SARIF даёт 502

Использовать svacer sarif2 import --upload. Проверить multipart/form-data. Проверить прокси. Обновить Svacer.

Нужно вырезать пути из SARIF

Фильтровать JSON через jq перед импортом.

4. Разметка, инварианты, миграция

Проблема

Решение

После обновления 11-2-0 → 12-0-1 не перенеслась разметка

1. Проверить, что снапшоты в одном бранче. 
2. Пересчитать инварианты: svacer admin --scope "container:invariants" --action update --id <branch_id> --user <u> --password <pass> --host <h> --port <port>. Пересчёт занимает время, в логе смотреть processInvUpdateRequest done. 
3. Если не помогло — запустить с --classic-inv-mode и дождаться миграции. Перед всем — бэкап.

Часть разметки не переносится между снапшотами

Использовать --path-prefix при импорте, чтобы отрезать меняющийся префикс пути. Для правки путей в готовом .snap — утилита pfixer. Попробовать --classic-inv-mode. Диагностика: quickdiff, marker match-journal. Перенос: markup2 export/import, экспорт/импорт snap.

Комментарии не переносятся

Проверить инварианты. Использовать markup2 export/import с --overwrite force. Попробовать экспорт/импорт snap.

Что делает SVACER_NO_INVARIANT_MIGRATION=true

Отключает массовую миграцию инвариантов при старте. Новые снимки всё равно считаются. Логику сопоставления не меняет.

Как понять, какие маркеры новые/пропали

svacer quickdiff --project <p> --branch <b> --snapshot_id_v1 <id1> --snapshot_id_v2 <id2> --format raw. В выводе: matched_markers — дефект есть в обоих снимках (инвариант совпал); same_markers — дефект есть, но отличается Marker_id или trace_id; missing_markers — был в старом, нет в новом (вероятно, исправлен); new_markers — появился в новом. Если маркер в matched или same — дефект всё ещё присутствует в коде.  

5. Производительность и ресурсы

Проблема

Решение

Сервер недоступен, высокий CPU/RAM, падает по OOM

Уменьшить MaxConns до 20. Проверить, не дёргается ли постоянно full-text search или API (сбор статистики, автоматика). Для диагностики запустить с SVACER_TRACE_OPTIONS=http_trace_on — в лог добавятся записи о входящих запросах. Обновить Svacer.

Долгий импорт, клонирование идёт часами

Проверить comment_history — её раздувание замедляет клонирование. См. раздел 2. Проверить таймауты (раздел 3). Обновить Svacer.

В логе context deadline exceeded, ошибки лидерства

Проверить БД, таймауты, нагрузку на хост. Обновить Svacer.

Долгий пересчёт инвариантов

Отключить SVACER_NO_INVARIANT_MIGRATION=true, если пересчёт при старте не нужен. Использовать --classic-inv-mode при необходимости.

6. API и CLI

Проблема

Решение

Нужно пересчитать инварианты по бранчу, а публичного API нет

Использовать CLI: svacer admin --scope "container:invariants" --action update --id <branch_id> --user <u> --password <pass> --host <h> --port <port>. Временно можно внутренний /api/containers/<BRANCH_ID>/invariants.

Ошибка при передаче custom_filter в публичный API

Обновиться до 12-0-1.

В ответе API нет поля со ссылкой (домена нет)

См. раздел 1 — запускать сервер с --public-url. В следующих релизах поле должно возвращаться.

Нужно получить id последнего снимка

svacer reports --host <h> --port <port> --grpc <g> --project <prj> --action last-snapshot → в JSON поле result.id. Либо REST: /api/public/projects/{project_id}/branch/{branch_id}/snapshots/last.

В Swagger нет нужного метода (например, для review, comments, clone branch, глобальных фильтров)

Внутреннее API не публикуется. Публичные аналоги — /api/public/.... Если метода нет — создать feature request на вынос.

7. Права, LDAP, безопасность

Проблема

Решение

Не хватает прав на очистку разметки

Выдать серверные доступы Server administration, а также проектные Import markup, Review markers. Если пользователь — автор проекта, достаточно Create projects и Server administration.

Анонимный импорт через встроенного пользователя importer

Удалить роль у пользователя importer (в UI через форму редактирования), сменить пароль на случайный. В будущих релизах — отключение системных пользователей.

Импорт от имени LDAP-пользователя не работает

Указать --ldap_server со значением, которое задано в конфиге (не адрес, а имя). Проверить роли и доступы LDAP-пользователя. Использовать актуальные параметры CLI.

Ошибка при синхронизации отключённого или отсутствующего в AD пользователя

Исправлено в 12-0-1. Обновиться.

8. UI, уведомления, отчёты

Проблема

Решение

Unexpected Application Error! Cannot read properties of null (reading 'forEach') при работе в UI

Сбросить настройки пользователя: под админом → Управление пользователями → в столбце действий «сбросить настройки». Если не помогло — очистить user_settings и custom_filters. Обновиться до актуальной версии.

Не отображаются комментарии к уязвимостям после копирования/импорта разметки

Использовать svacer markup2 export/import. Проверить инварианты (раздел 4). В 12-0-1 были исправления в этой области.

В PDF-отчёте указана неверная версия Svace

Включить генерацию PDF на основе HTML, установить браузер на сервере. В 12-й версии при этом механизме версия выводится корректно. Native PDF берёт версию Svace из конфигурации детекторов — исправление в следующем релизе.

Нет оповещений о появлении нового проекта / ветки / снимка

Настроить почтовый сервер для Svacer. Затем в UI — подписки на нужные события (в частности, чек-бокс «Снимки»). Возможны уведомления через Telegram-бота.

9. Бэкап и восстановление

Проблема

Решение

Как делать бэкап Svacer

PostgreSQL: pg_dump. Object store: rsync в отдельную директорию. Есть скрытая команда svacer server backup --host <h> --port <port> --grpc <g> --user <u> --password <pass> export --checkpoint <path> — создаёт копию object store с использованием hard link. Проверять бэкап через zstd.

Бэкап object store оказался битым

Проверить zstd -v -d <файл> -o /dev/null. Восстановить из другого бэкапа. Разбираться с причиной повреждения (диск, передача файла, обрыв записи).

Восстановление из бэкапа object store

Остановить сервер. Развернуть object store из бэкапа в отдельную директорию (лучше через rsync). Запустить Svacer с --store=<путь>. Проверить, что снимки открываются корректно. Если что-то не так — проверить, не создалось ли лишних подпапок при копировании.

 

Нужно убедиться, что бэкапы валидны

Автоматической проверки в продукте пока нет. Проверять вручную через zstd -d и тестовое восстановление на отдельном экземпляре.

10. Быстрые команды

Задача

Команда

Пересчёт инвариантов по бранчу

svacer admin --scope "container:invariants" --action update --id <branch_id> --user <u> --password <pass> --host <h> --port <port>

Импорт с обрезкой префикса пути

svacer import --path-prefix ...

Правка путей в готовом снапшоте

pfixer --source <in.snap> --output <out.snap> --map "<from>:<to>"

Бэкап object store

rsync -a /data/store/ /backup/store/

Копия object store через сервер

svacer server backup --host <h> --port <port> --grpc <g> --user <u> --password <pass> export --checkpoint <path>

Проверка бэкапа object store

zstd -v -d <файл> -o /dev/null

Очистка истории комментариев

psql -U svace -d svace -c 'truncate comment_history;'

Компактификация object store

svacer-server run --compact-object-store ...

Указание публичного URL

svacer-server run --public-url https://...

Быстрое сравнение снимков

svacer quickdiff --project <p> --branch <b> --snapshot_id_v1 <id1> --snapshot_id_v2 <id2> --format raw

Получить последний снимок

svacer reports --host <h> --port <port> --grpc <g> --project <prj> --action last-snapshot

Список правил очистки

svacer server cleanup list

Добавить правило очистки

svacer server cleanup add --keep-time <N>h