[О блоге]
[наверх]
[пред]
[2021-09-25 19:55:50+03:00]
[b90947342b209343533a2560b92f80eb76284fe5]
Темы: [python]
GoCheese 3.0.0
http://www.gocheese.cypherpunks.ru/
Сделал большой пребольшой релиз GoCheese. Самое приятное в Python --
писать для него на Go.
Пароли теперь управляются не через текстовый файл, читаемый при запуске
и при получения SIGHUP, а полностью динамически через FIFO файл. Плюс
теперь он может работать как UCSPI-TCP демон. Это всё сделано "чтобы было".
Плюс явно включается поддержка HTTP/2, keepalive-ов и TLS session
resumption -- реально заметно как пошустрее он работает при большом
количестве запросов с PyPI.
А из серьёзных изменений это поддержка метаданных. Теперь используется
ещё и (в довесок к Simple API) JSON API, из которого получаются
метаданные (автор, описание, и всё в таком духе) и они сохраняются в
recfile-е пакета. Из них берётся и created время и оно форсированно
используется для выставления mtime файлов на диске. Этот же mtime честно
отдаётся и в HTTP заголовках. При загрузке пакета, все метаданные тоже
аналогично сохраняются. Сам GoCheese тоже теперь отвечает по JSON API,
отдавая аналогичный ответ как и PyPI. Скрипт конвертирования БД PyShop-а
тоже учитывает время создания пакетов и его корректно выставляет при
миграции.
Прежде я уже себе делал полный слепок состояния пакетов с PyPI. Просто
curl-ом дёргал /simple/, получал полный список пакетов, а дальше через
GNU parallel запускал curl-ы к GoCheese, чтобы он выполнял refresh
пакетов: контрольные суммы для каждого пакета сохранялись на диске.
Очень нравится --bar опция, которая показывает progress bar с кол-вом
выполненных/всего задач, текущей и примерно сколько времени ещё ждать:
69% 227891:101285=1h23m59s pykirara
Сейчас вот уже несколько часов снова идёт обновление состояния, дабы
обновить mtime-ы и metadata для всех пакетов. GOCHEESE_NO_SYNC=1
переменная окружения отключает fsync, что сильно всё ускоряет.
Есть пара моментов которые где-нибудь когда-нибудь могут да выстрелить.
Понять версию пакета по его имени -- нетривиальная задача: 1.5.1,
1.5.2b2, 161, 3.10a, 8.02, 3.4j, 1996.07.12, 3.2.pl0, 3.1.1.6, 2g6, 11g,
0.960923, 2.2beta29, 1.13++, 5.5.kw, 2.0b1pl0 -- это всё валидные версии.
Плюс названия имён файлов далеко не всегда совпадают с каноничным
названием пакета на диске. Фиг с ходу поймёшь где начинается/кончается
версия пакета. Я поэтому сделал очень простой парсер, где-то точно
наверное не сработающий. Ну и в a251453c84f341e535bfabbce4ed4031cc791854
я увидел что формат JSON API нигде не описан и не стандартизирован, плюс
идёт в разрез с некоторыми PEP. Поэтому у меня нормальная
PEP-совместимая (вру, одно поле я не обрабатываю из-за противоречивости
PEP) схема и урезанная. Нормальная версия отдаётся самим GoCheese по
JSON API. Если GoCheese стучится в GoCheese -- то потерь информации не
происходит. А если стучится в боевой PyPI, то парсинг упадёт и будет
использоваться урезанная версия, с небольшой потерей метаинформации.
[оставить комментарий]