114 lines
6.0 KiB
Markdown
114 lines
6.0 KiB
Markdown
# alt-rpm-set-version
|
||
|
||
Research on ALT Linux RPM set.c and dependency comparison using encoded symbol sets.
|
||
|
||
- [Docs about current set:version implementation](Docs/set:version.md)
|
||
|
||
# Compare results
|
||
|
||
| command | original set.c | orig set (w/out optim) | set9.c |
|
||
| :-------------------------- | :------------: | :--------------------: | :----: |
|
||
| -s check | x1 | x3.134 | x1.041 |
|
||
| -s autoremove | x1 | x2.564 | x1.053 |
|
||
| -s install rpm-build | x1 | x2.578 | x1.036 |
|
||
| -s install openuds-server | x1 | x1.946 | x1.094 |
|
||
| -s install password-store | x1 | x2.941 | x1.073 |
|
||
| --enable-upgrade -s upgrade | x1 | x1.351 | x1.100 |
|
||
| -s dist-upgrade | x1 | x1.204 | x1.044 |
|
||
|
||
Более подробные данные сравнения приведены [здесь](Docs/test_result.md)
|
||
|
||
# Testing
|
||
|
||
Для проверки используются четыре скрипта из каталога `scripts`.
|
||
|
||
## Случайные наборы символов
|
||
|
||
### `scripts/rpmsetinit/compare_random_sets.py`
|
||
|
||
Проверяет совместимость кодировщиков: компилирует `set.c` и
|
||
`reimplement/newset.c`, генерирует случайные списки символов и сравнивает
|
||
полученные set-строки при случайном `bpp` от 10 до 32.
|
||
|
||
Пути до наобходимых файлов приведены в коде скрипта.
|
||
Минимальный запуск из корня репозитория:
|
||
|
||
```sh
|
||
python3 scripts/rpmsetinit/compare_random_sets.py
|
||
```
|
||
|
||
Нужны Python 3 и C-компилятор `cc`. Скрипт работает непрерывно до `Ctrl-C`;
|
||
входы, на которых результаты различаются, сохраняются в
|
||
`scripts/rpmsetinit/error/`.
|
||
|
||
### `scripts/rpmsetcmp/compare_random_sets.py`
|
||
|
||
Проверяет совместимость `rpmsetcmp()` из `set.c` и
|
||
`reimplement/newset.c`. Скрипт генерирует равные, вложенные, несравнимые и
|
||
некорректные множества, проверяет оба направления сравнения и сопоставляет
|
||
коды результатов двух реализаций.
|
||
|
||
Пути до наобходимых файлов приведены в коде скрипта.
|
||
Минимальный запуск:
|
||
|
||
```sh
|
||
python3 scripts/rpmsetcmp/compare_random_sets.py
|
||
```
|
||
|
||
Нужны Python 3 и `cc`. Тест также работает до `Ctrl-C`, а найденные
|
||
расхождения сохраняет в `scripts/rpmsetcmp/error/`.
|
||
|
||
## Проверка зависимостей Sisyphus
|
||
|
||
### `scripts/rpmsetcmp/check_sisyphus_set_relations.sh`
|
||
|
||
Скрипт загружает в изолированный временный APT-каталог метаданные Sisyphus,
|
||
извлекает set:version `Provides` и `Requires`, компилирует компаратор из
|
||
`reimplement/newset.c` и проверяет, что требования пакетов удовлетворяются
|
||
хотя бы одним провайдером. По умолчанию проверяются первые 100 уникальных
|
||
требований; лимит задаётся переменной `REQUIRE_LIMIT` в начале файла.
|
||
`REQUIRE_LIMIT=0` для снятия лимита
|
||
|
||
Минимальный запуск на ALT Linux с доступом к зеркалу Sisyphus:
|
||
|
||
```sh
|
||
bash scripts/rpmsetcmp/check_sisyphus_set_relations.sh
|
||
```
|
||
|
||
Нужны `apt-get`, `apt-cache`, `cc`. В конце выводятся числа совместимых требований,
|
||
требований без провайдера, несовместимых пар и ошибок декодирования.
|
||
|
||
## Сравнение производительности
|
||
|
||
### `scripts/run-setc-bench.sh`
|
||
|
||
Скрипт берёт все `*.c` из `~/setc`, для каждого варианта собирает отдельные
|
||
`rpm-build` и `librpm7` в hasher, подставляя файл как `lib/set.c`. Затем он
|
||
запускает с этой `librpm` одинаковый набор симуляций APT (`check`,
|
||
`autoremove`, `install`, `upgrade`, `dist-upgrade`), записывает коды возврата и
|
||
время трёх прогонов в TSV. При включённых `COLLECT_PERF` и
|
||
`PERF_RECORD` дополнительно создаются результаты `perf stat`, `perf record`,
|
||
`perf report` и `perf annotate`.
|
||
|
||
Минимальная подготовка:
|
||
|
||
1. Запускать на ALT Linux p11 с настроенными `gear-hsh`/`hasher` и разрешённым
|
||
монтированием `/proc`.
|
||
2. Скопировать сравниваемые реализации в `~/setc/`, по одному файлу `*.c` на
|
||
вариант.
|
||
3. Проверить настройки в начале скрипта: `PACKAGER`, `APT_SOURCE`, `CPU` и
|
||
каталоги `SETC_DIR`, `WORK_ROOT`, `RESULT_DIR`.
|
||
4. Для запуска без perf установить `COLLECT_PERF=0`; для профилирования
|
||
оставить `COLLECT_PERF=1`, установить пакет `perf` и разрешить доступ к
|
||
счётчикам производительности.
|
||
|
||
Запуск:
|
||
|
||
```sh
|
||
bash scripts/run-setc-bench.sh
|
||
```
|
||
|
||
По умолчанию рабочие каталоги создаются в `~/setc-bench`, а итоговые TSV и
|
||
perf-артефакты — в `~/res`. Первый запуск скачивает исходники и собирает RPM,
|
||
поэтому занимает значительно больше времени, чем случайные проверки.
|